java - 将对象列表转换为 <String,Map<String,Integer>> java8 流的映射

标签 java lambda java-8

你好我有一个对象列表我的对象有三个字段

class MyObject{
   String x;
   String y;
   int  z;
   //getters n setters
}

我需要将此列表转换为 Map<String,Map<String,Integer>>

就是这样的: {x1:{y1:z1,y2:z2,y3:z3},x2{y4:z4,y5:z5}} format 我想在 Java 8 中执行此操作,我认为我对它比较陌生。

我尝试了以下方法:

Map<String,Map<String,Integer>> map=list.stream().
                collect(Collectors.
                        groupingBy(MyObject::getX,list.stream().
                                collect(Collectors.groupingBy(MyObject::getY,
                                        Collectors.summingInt(MyObject::getZ)))));

这甚至无法编译。非常感谢帮助

最佳答案

您可以通过链接两个 groupingBy Collector 和一个 summingInt Collector 来实现:

Map<String,Map<String,Integer>> map = 
    list.stream()
        .collect(Collectors.
                    groupingBy(MyObject::getX,
                               Collectors.groupingBy(MyObject::getY,
                                                     Collectors.summingInt(MyObject::getZ))));

我希望我得到了你想要的正确逻辑。

将以下内容添加到输入 List 时:

list.add(new MyObject("A","B",10));
list.add(new MyObject("A","C",5));
list.add(new MyObject("A","B",15));
list.add(new MyObject("B","C",10));
list.add(new MyObject("A","C",12));

你得到一个输出 Map :

{A={B=25, C=17}, B={C=10}}

关于java - 将对象列表转换为 <String,Map<String,Integer>> java8 流的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38686769/

相关文章:

Java 8 循环特殊金字塔逻辑

java - p :confirm dialog's OK ignored in Chrome 74

java - Spring Boot 的 JHipster WAR Artifact 重命名为 JAR 无法运行

python - 为什么我们不能直接将 lambda 函数/表达式的输出直接打印为字符串、列表或元组?

Lambda 似乎在 VS2010 中的 ref 类中不起作用

Java 8 - 外部迭代比内部迭代表现更好?

Java 本地嵌套类和访问 super 方法

java - 如何以与 JFrame 相同的方式编写 Android 应用程序

c# - 方法中有Lambda表达式为什么不能编辑继续调试?

java - Java 8 中使用非静态方法的 lambda