Java:使用Stream连接两个Map <string,object =“”>列表

时间:2017-02-04 02:42:16

标签: java

我有两个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类来加入这些列表。

如何加入以显示结果的值?

如果StreamList1非常大,Java 8中的List2类是否快速稳定?

1 个答案:

答案 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,并且不会修改其他列表List1List2。如果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);