2017-03-29 2 views
5

Ich habe mit Java 8 Stream API herumgespielt und stieß auf etwas, was ich nur durch traditionelle for-Schleifen tun konnte.Java - Plane verschachtelte Map mit Stream

eine verschachtelte Karte von

{ 
    1999: { 
      3: [23, 24, 25], 
      4: [1, 2, 3] 
      }, 
    2001: { 
      11: [12, 13, 14], 
      12: [25, 26, 27] 

      } 
} 

Gegeben Wie kann ich das

['23,3,1999', '24,3,1999', '25,3,1999', '1,4,1999', '2,4,1999', '3,4,1999', '12,11,2001', '13,11,2001', '14,11,2001', '25,12,2001', '26,12,2001', '27,12,2001'] 

in transformieren Grundsätzlich möchte ich replizieren: diese

Map<Integer, Map<Integer, List<Integer>>> dates... 
    List<String> flattened = new ArrayList<>(); 
    for (Integer key1 : map.keySet()) { 
     for (Integer key2 : map.get(key1).keySet()) { 
      for (Integer value : map.get(key1).get(key2)) { 
       flattened.add(value + "," + key2 + "," + key1); 
      } 
     } 
    } 
+1

Was haben Sie bisher versucht? – Flown

Antwort

6

Versuchen Sie zum Beispiel:

public static void main(String[] args) { 
    Map<Integer, Map<Integer, List<Integer>>> dates = 
     new HashMap<Integer, Map<Integer, List<Integer>>>() {{ 
      put(1999, new HashMap<Integer, List<Integer>>() {{ 
       put(3, Arrays.asList(23, 24, 25)); 
       put(4, Arrays.asList(1, 2, 3)); 
      }}); 
      put(2001, new HashMap<Integer, List<Integer>>() {{ 
        put(11, Arrays.asList(12, 13, 14)); 
        put(12, Arrays.asList(25, 26, 27)); 
      }}); 
     }}; 

    dates.entrySet().stream().flatMap(year -> 
     year.getValue().entrySet().stream().flatMap(month -> 
      month.getValue().stream() 
       .map(day -> day + "," + month.getKey() + "," + year.getKey()))) 
     .forEach(System.out::println); 
} 

und wenn man sie von year sortiert müssen dann month dann day versuchen Sie dies:

dates.entrySet().stream().flatMap(year -> 
     year.getValue().entrySet().stream().flatMap(month -> 
      month.getValue().stream() 
       .map(day -> Arrays.asList(year.getKey(), month.getKey(), day)))) 
     .sorted(Comparator.comparing(l -> l.get(0)*10000 + l.get(1)*100 + l.get(2))) 
     .forEach(System.out::println); 
3
items 
      .entrySet() 
      .stream() 
      .flatMap(
        l-> l.getValue().entrySet().stream() 
          .flatMap(
            ll->ll.getValue().stream() 
             .map(lll+","+ll.getKey()+","+l.getKey()))) 
      .collect(Collectors.toList()) 
      .forEach(System.out::println); 
1

Angenommen, es ist ein Holder, die drei ganze Zahlen zum Beispiel nehmen:

static class Holder { 

     private final int first; 
     private final int second; 
     private final int third; 
} 

Und diese sind einige verschachtelte Karten, dann 2 flatMap erreichen, was Sie wollen: