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"))));