Bei einem Map<String, Object>
, in dem die Werte entweder String
oder ein anderer Map<String, Object>
sind, wie würde man mit Java 8 die Maps auf eine einzige Liste von Werten reduzieren?Rekursiv Werte von verschachtelten Maps in Java reduzieren 8
Beispiel:
Map - "key1" -> "value1"
- "key2" -> "value2"
- "key3" -> Map - "key3.1" -> "value3.1"
- "key3.2" -> "value3.2"
- "key3.3" -> Map - "key3.3.1" -> "value3.3.1"
- "key3.3.2" -> "value3.3.2"
Für das obige Beispiel würde Ich mag die folgende Liste:
value1
value2
value3.1
value3.2
value3.3.1
value3.3.2
Ich weiß, es kann wie folgt geschehen:
public static void main(String args[]) throws Exception {
//Map with nested maps with nested maps with nested maps with nested......
Map<String, Object> map = getSomeMapWithNestedMaps();
List<Object> values = new ArrayList<>();
addToList(map, values);
for (Object o:values) {
System.out.println(o);
}
}
static void addToList(Map<String, Object>map, List<Object> list) {
for (Object o:map.values()) {
if (o instanceof Map) {
addToList((Map<String, Object>)o, list);
} else {
list.add(o);
}
}
}
Wie kann Ich mache das mit einer Stream
?
Edit:
Nach einigen Herumspielen ich es herausgefunden:
public static void main(String args[]) throws Exception {
//Map with nested maps with nested maps with nested maps with nested......
Map<String, Object> map = getSomeMapWithNestedMaps();
//Recursively flatten maps and print out all values
List<Object> list= flatten(map.values().stream()).collect(Collectors.toList());
}
static Stream<Object> flatten(Stream<Object> stream) {
return stream.flatMap((o) ->
(o instanceof Map) ? flatten(((Map<String, Object>)o).values().stream()) : Stream.of(o)
);
}
http://stackoverflow.com/questions/21646683/recursive-stream schlägt vor, eine Methodenreferenz zu verwenden. – jaco0646