Java:连接两个地图列表<;字符串,对象>;使用流
我有两个Java:连接两个地图列表<;字符串,对象>;使用流,java,Java,我有两个Map列表,如下所示: 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"] } 我想使用Jav
Map
列表,如下所示:
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"] }
我想使用Java8中的流
类加入这些列表
如何加入以获得显示的结果值
如果
List1
和List2
非常大,Java 8中的Stream
类是否快速稳定?啊,现在我知道你想要什么了:)
我不知道是否有更好的方法来处理流,但这里有一个解决方案
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());
这样就可以修改list1
的条目。因此,在上面的示例中,list1
is变成了加入列表
。但实际上,使用没有任何副作用的方法是一种很好的做法。所以我不喜欢上面的例子
我建议使用一种方法getJoinedList
,它返回一个新列表,并且不修改其他列表。在这种情况下,我不会使用流
,而是使用老式的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;
}
私有静态列表getJoinedList(
列表l1,列表l2){
列表结果=新建ArrayList();
用于(地图m1:l1){
Map newMap=newhashmap();
newMap.putAll(m1);
用于(地图m2:l2){
如果(m1.get(“ID”)等于(m2.get(“ID”)){
newMap.put(“董事”),m2.get(“董事”);
打破
}
}
结果.添加(newMap);
}
返回结果;
}
然后你可以像这样调用这个方法
List<Map<String, String>> joinedList = getJoinedList(l1, l2);
List joinedList=getJoinedList(l1,l2);
如果绩效很重要,您应该首先建立董事索引:
Map<Object, Object> directors = list2.stream()
.collect(Collectors.toMap(m -> m.get("ID"), m -> m.get("director")));
通过
映射访问控制器
比在控制器中搜索每个列表条目要快。为什么不简单地添加所有条目<代码>列表1.addAll(列表2)无法使用addAll方法,因为结果与上面的不同。@nguyenduta第一个列表中映射的键是什么。是演员吗?第二个列表中的Map
s的键如何?@Cking我想在IDYes上加入这些列表,但是你在地图中插入的键是什么?OP似乎有一个list
的Map
对象。@Cking是的,这也是我所拥有的。我试图弄清楚的是m.get(“ID”)的确切含义
和m.get(“director”)
do。OP没有提到他们在地图中使用字符串“ID”和“director”作为键。@ck是的,他这样做了。请看第一行。下面是一些代码:我看到了你的代码,这正是我的问题。OP为list1
提供了示例输入数据,如[{ID=1,actor=“A”,film AA},{ID=1,actor=“B”,film=“AA”}
。请特别注意大括号和逗号。列表中的第一个映射是{ID=1,actor=“A”,film=“AA”}
,后面是,
。列表中的第二个映射是{ID=1,actor=“B”,film=“AA”}
。但是您假定的结构是{ID],1},{actor”,“A},{film AA},{“ID”,1},{“actor”,“B”},{“film”,“AA”}
。这就是为什么我在评论中问OP有关键的问题。谢谢!我会试试的。:)
Map<Object, Object> directors = list2.stream()
.collect(Collectors.toMap(m -> m.get("ID"), m -> m.get("director")));
list1.stream().forEach(m -> m.put("director", directors.get(m.get("ID"))));