2017-06-19 15 views
-1

Wie greife ich auf eine Liste in einer Karte des Typs Map <String, Object> zu?Wie kann ich auf eine Liste in einer Karte zugreifen und diese Liste durchlaufen?

public Map<String, Object> getListInsideMapObject(Long id, Date from) { 

    Map<String, Object> result = new HashMap<>(); 
    List<Map<String, Object>> mapList = new ArrayList<>(); 

    List<MappedList> conTime = new ArrayList<>(); 
    conTime = xxxRepository.findByxxx(id, from); 

    Map<String, Object> map = xxxService.xxx(id); 
    List<String> times = (List<String>) map.get("xxx"); 

    for (MappedList t : conTime) { 
     int num = 0; 
     Map<String, Object> res = new HashMap<>(); 
     res.put("x", ""); 
     res.put("status", null); 

     for (Contraction c : con) { 
      num++; 
      res.put("status", "stat"); 
      res.put("x", new Date()); 
     } 
    } 

    res.put("y", num); 

    mapList.add(res); 

    result.put("mapList", mapList); 
    result.put("mapListA", mapListA); 
    result.put("mapListB", mapListB); 
    //etc 

    return result; 
} 

Ich versuche, diesen Dienst (getListInsideMapObject) und jede Liste von dieser Karte und Schleife durch jede Liste zugreifen zu rufen. zum Beispiel in der Klasse xxx will ich getListInsideMapObject (Long-ID, Datum ab) als Service und Zugriff auf jede Liste aus der Karte

+0

Sie könnten ein [MCVE] veröffentlichen die Komplexität des Codes zu reduzieren. Von dem, was ich sehe, haben Sie nur eine 'Liste ' so was ist das Problem – AxelH

+0

Sie scheinen bereits Code zu haben, der versucht zu tun, was Sie fragen. Funktioniert es nicht? Wenn nicht, welchen Fehler bekommen Sie oder was ist die erwartete gegenüber der tatsächlichen Ausgabe? Unabhängig davon, ob Ihr Code versucht, das zu tun, was Sie fragen, können Sie ein [mcve] -Programm veröffentlichen, das Ihr Problem genauer zeigt? – Dukeling

+0

was ist 'w', was ist' schwach'. Warum heißt Ihre Methode "getListInsideMapObject", baut aber tatsächlich eine Karte? Sie sollten klarer sein. –

Antwort

1

Ich stelle mir Sie so etwas wie dies wollen:

public NewClass1() { 
    // have an instance from the class that gives you the map 
    ClassThatBuildsTheMap mapClass = new ClassThatBuildsTheMap(); 
    // get the map. must provide id and date 
    Map <String, Object> myMap = mapClass.getListInsideMapObject(id, date); 
    // access the lists inside the map 
    useListInsideAMap(myMap); 
} 

private void useListInsideAMap(Map<String, Object> map){ 
    // Prior to Java8: 
    for (Map.Entry<String, Object> entry : map.entrySet()) { 
     String key = entry.getKey(); // if you want to use the key 
     Object value = entry.getValue(); 
     if(value instanceof List){ 
      // I supose it is a list of sytrings 
      List l = (List) value; 
      for (Object item : l) { 
       // Do something with the item from the list 
      } 
     } 
    } 

    // Java8: 
    // loop through the map 
    map.forEach((String key, Object value)->{ 
     // if you want to use key, just call key 

     // checks if the value (Object) from the map is a list 
     if(value instanceof List){ 
      List l = (List)value; 
      // loop through the list 
      l.forEach((Object item)->{ 
       // Do something with the item from the list 
      }); 
     } 
    }); 
} 
+0

Diese Lösung funktionierte perfekt. Vielen Dank – joseph

0

Sie werfen Ihre Object zu List

Map<String, Object> result = new HashMap<>(); 
List<Map<String, Object>> mapList= new ArrayList<>(); 
result.put("1", mapList); 
------------------------------------------------------- 
List<Map<String, Object>> = (List<Map<String, Object>>)result.get("1") 

Dann können Sie Schleife, können anrufen normalerweise für/foreach verwenden.

0

Sie können auch Optional Objekt verwenden, um Ihre Karte Wert von Schlüssel zu bekommen und überprüfen Sie es vor cast benötigt Typ (ClassCastException Probleme zu vermeiden):

Map<String, Object> someMap = new HashMap<>(); 

List<Map<String, Object>> result = Optional.ofNullable(someMap.get("id")) 
     .filter(obj -> obj instanceof List) 
     .map(obj -> (List<Map<String, Object>>)obj) 
     .orElse(Collections.emptyList()); 

In diesem Fall werden Sie leer List haben (wenn das Element verpasst oder Typ ist kein List) oder erwarteter List Wert.

Verwandte Themen