首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加入Java 8集合API

加入Java 8集合API
EN

Stack Overflow用户
提问于 2014-05-09 11:42:20
回答 1查看 3.9K关注 0票数 14

我有两个List<Map<String, Object>>对象。

代码语言:javascript
复制
[{Month=August-2013, Sales=282200}, {Month=July-2013, Sales=310400}, 
 {Month=June-2013, Sales=309600}, {Month=May-2013, Sales=318200}, 
 {Month=September-2013, Sales=257800}]

代码语言:javascript
复制
[{Month=April-2013, NoOfTranx=8600}, {Month=August-2013, NoOfTranx=6700}, 
 {Month=July-2013, NoOfTranx=14400}, {Month=June-2013, NoOfTranx=8500}, 
 {Month=May-2013, NoOfTranx=14400}]

我想在join(Merge)键上列出这两个列表。如何执行多个连接操作(如FULL OUTER JOIN, RIGHT OUTER JOIN等)在这些列表中使用新的集合API

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-09 12:14:46

执行完全外部连接的一种方法是首先构造一个将月份值链接到映射本身并获取列表中的值的Map<String, Map<String, Object>>

代码语言:javascript
复制
//first concatenate the two lists
Map<String, Map<String, Object>> result = Stream.concat(list1.stream(),
                                                        list2.stream())
                //then collect in a map where the key is the value of the month
                .collect(toMap(m -> (String) m.get("Month"),
                //the value is the map itself
                               m -> m,
                //merging maps (i.e. adding the "Sales" and "NoOfTranx" infos)
                               (m1, m2) -> {m1.putAll(m2); return m1; }));

//finally put that in a list
List<Map<String, Object>> merge = new ArrayList<>(result.values());

备注:

  • 原始映射被修改--如果这是不可取的,您可以在合并部分创建一个new HashMap<>()
  • 对于左/右外部联接,只能流一个列表并在流中添加相关条目。
  • 对于内部联接,您可以从其中一个列表开始,筛选另一个列表中的元素,然后继续上面的操作。

下面是打印的完整示例:

代码语言:javascript
复制
list1 = [{Month=August-13, Sales=282200}, {Month=July-13, Sales=310400}]
list2 = [{Month=August-13, NoOfTranx=6700}, {Month=July-13, NoOfTranx=14400}]
merge = [{Month=August-13, Sales=282200, NoOfTranx=6700}, {Month=July-13, Sales=310400, NoOfTranx=14400}]

代码:

代码语言:javascript
复制
public static void main(String[] args) {
    List<Map<String, Object>> list1 = new ArrayList<>();
    list1.add(map("Month", "August-13", "Sales", 282200));
    list1.add(map("Month", "July-13", "Sales", 310400));
    System.out.println("list1 = " + list1);

    List<Map<String, Object>> list2 = new ArrayList<>();
    list2.add(map("Month", "August-13", "NoOfTranx", 6700));
    list2.add(map("Month", "July-13", "NoOfTranx", 14400));
    System.out.println("list2 = " + list2);

    Map<String, Map<String, Object>> result = Stream.concat(list1.stream(),
                                                            list2.stream())
                .collect(toMap(m -> (String) m.get("Month"),
                               m -> m,
                               (m1, m2) -> {m1.putAll(m2); return m1; }));

    List<Map<String, Object>> merge = new ArrayList<>(result.values());
    System.out.println("merge = " + merge);
}

private static Map<String, Object> map(Object... kvs) {
    Map<String, Object> map = new HashMap<>();
    for (int i = 0; i < kvs.length; i += 2) {
        map.put((String) kvs[i], kvs[i+1]);
    }
    return map;
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23563728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档