在Java 8中递归地展平嵌套映射的值 [英] Recursively Flatten values of nested maps in Java 8
问题描述
给定 Map< String,Object>
,其中值为 String
或其他 Map< String,Object>
,如何使用Java 8将地图展平为单个值列表?
Given a Map<String, Object>
, where the values are either a String
or another Map<String, Object>
, how would one, using Java 8, flatten the maps to a single list of values?
示例:
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"
对于上面的例子,我想要以下列表:
For the above example, I would like the following list:
value1
value2
value3.1
value3.2
value3.3.1
value3.3.2
我知道可以这样做:
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);
}
}
}
我怎样才能做到这一点a 流
?
How can I do this with a Stream
?
编辑:
之后玩弄我想通了:
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)
);
}
推荐答案
您可以定义递归方法它将一个地图展平并将其用作 Stream#flatMap
的函数,或直接调用它来使用它。
You could define a recursive method which flattens one map and use it as a function for Stream#flatMap
or use it by calling it directly.
示例:
public class FlatMap {
public static Stream<Object> flatten(Object o) {
if (o instanceof Map<?, ?>) {
return ((Map<?, ?>) o).values().stream().flatMap(FlatMap::flatten);
}
return Stream.of(o);
}
public static void main(String[] args) {
Map<String, Object> map0 = new TreeMap<>();
map0.put("key1", "value1");
map0.put("key2", "value2");
Map<String, Object> map1 = new TreeMap<>();
map0.put("key3", map1);
map1.put("key3.1", "value3.1");
map1.put("key3.2", "value3.2");
Map<String, Object> map2 = new TreeMap<>();
map1.put("key3.3", map2);
map2.put("key3.3.1", "value3.3.1");
map2.put("key3.3.2", "value3.3.2");
List<Object> collect = map0.values().stream().flatMap(FlatMap::flatten).collect(Collectors.toList());
// or
List<Object> collect2 = flatten(map0).collect(Collectors.toList());
System.out.println(collect);
}
}
对于给定的嵌套地图,它会打印
For the given nested map, it prints
[value1,value2,value3.1,value3.2,value3.3.1,value3.3.2]
[value1, value2, value3.1, value3.2, value3.3.1, value3.3.2]
这篇关于在Java 8中递归地展平嵌套映射的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!