我有一个对象,
class Object2{
String name;
String id;
Map<String, String> customData;
}
class Object1{
List<Object2> obj1List;
}
我想将此object1列表中的customData映射转换为一个单个映射,如果键已经存在,可以覆盖这些值。
答案 0 :(得分:6)
这是使用lambda和Java 8的一种方式:
Map<String, String> map = new LinkedHashMap<>();
object1List.forEach(o1 ->
o1.getObject1List().forEach(o2 -> map.putAll(o2.getCustomData())));
答案 1 :(得分:3)
按如下方式使用flatMap
和toMap
:
List<Object1> source = ...
Map<String, String> result =
source.stream()
.flatMap(e -> e.getObj1List().stream()
.flatMap(a -> a.getCustomData().entrySet().stream()))
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (l, r) -> r));
或者如果要处理单个Object1
对象:
Object1 myObj = ...
Map<String, String> result =
myObj.getObj1List()
.stream()
.flatMap(a -> a.getCustomData().entrySet().stream())
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (l, r) -> r));
答案 2 :(得分:3)
或者,您可以执行Stream.flatMap
,然后将Map.putAll
用作
List<Object1> object1s = new ArrayList<>(); // initialise as you would
Map<String, String> finalCustomData = new LinkedHashMap<>();
object1s.stream() // Stream<Object1>
.flatMap(o1 -> o1.getObj1List().stream()) // Stream<Object2>
.map(Object2::getCustomData) // Stream<Map<String, String>>
.forEach(finalCustomData::putAll);