你好,我有一个对象列表,我的对象有三个字段
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}}
格式我想在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)))));
这甚至都没有编译。非常感谢帮助
答案 0 :(得分:7)
你可以通过链接两个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}}