我有两个Map<String, Object>
列表,如下所示:
List1=[ {ID=1, actor="A", film="AA"},
{ID=1, actor="B", film="AA"} ]
List2={ [ID = 1, director="C"] }
Result = { [ID=1, actor="A", film="AA", director="C"],
[ID=1, actor="B", film="AA", director="C"] }
我想使用Java 8中的Stream
类来加入这些列表。
如何加入以显示结果的值?
如果Stream
和List1
非常大,Java 8中的List2
类是否快速稳定?
答案 0 :(得分:1)
啊,现在我明白你想要的:) 我不知道流是否有更好的方法,但这是一个可行的解决方案。
List<Map<String, String>> resultList = l1.stream()
.map(m1 -> {
Map<String, String> map = new HashMap<>();
map.putAll(m1);
l2.stream()
.filter(m2 -> map.get("ID").equals(m2.get("ID")))
.findFirst()
.ifPresent(m2 -> map.put("director", m2.get("director")));
return map;
})
.collect(Collectors.toList());
上述代码会生成新的列表resultList
,并且不会修改其他列表List1
和List2
。如果List1
被修改无关紧要,你可以用更清晰,更易读的方式来做。
l1.forEach(m1 -> l2.stream()
.filter(m2 -> m1.get("ID").equals(m2.get("ID")))
.findFirst()
.ifPresent(m2 -> m1.putIfAbsent("director", m2.get("director"))));
这样list1
的条目就会被修改。因此,使用上面的示例list1
成为joined list
。但是,没有任何副作用的方法实际上是一种很好的做法。所以我不喜欢上面的例子。
我建议使用方法getJoinedList
,它返回一个新的List而不修改其他列表。在这种情况下,我不会使用streams
,而是使用老式的for循环。
private static List<Map<String, String>> getJoinedList(
List<Map<String, String>> l1, List<Map<String, String>> l2) {
List<Map<String, String>> result = new ArrayList<>();
for (Map<String, String> m1 : l1) {
Map<String, String> newMap = new HashMap<>();
newMap.putAll(m1);
for (Map<String, String> m2 : l2) {
if (m1.get("ID").equals(m2.get("ID"))) {
newMap.put("director", m2.get("director"));
break;
}
}
result.add(newMap);
}
return result;
}
然后你可以这样调用这个方法。
List<Map<String, String>> joinedList = getJoinedList(l1, l2);