按三个字段分组,然后使用Java8流收集器和EntrySet对BigDecimal求和
我有一份饮料清单按三个字段分组,然后使用Java8流收集器和EntrySet对BigDecimal求和,java,java-stream,Java,Java Stream,我有一份饮料清单 List<Beverage>beverages= Arrays.asList( new Beverage("Alcoholic","Can","Budweiser",new BigDecimal(5)), new Beverage("Alcoholic","Can","Budweiser",new B
List<Beverage>beverages= Arrays.asList(
new Beverage("Alcoholic","Can","Budweiser",new BigDecimal(5)),
new Beverage("Alcoholic","Can","Budweiser",new BigDecimal(10)),
new Beverage("Alcoholic","Bottle","Budweiser",new BigDecimal(15)),
new Beverage("Alcoholic","Bottle","Budweiser",new BigDecimal(20)),
new Beverage("Alcoholic","Can","Tecate",new BigDecimal(5)),
new Beverage("Alcoholic","Bottle","Tecate",new BigDecimal(10)),
new Beverage("Alcoholic","Bottle","Tecate",new BigDecimal(16)),
new Beverage("Non-Alcoholic","Can","Coke",new BigDecimal(10)),
new Beverage("Non-Alcoholic","Can","Coke",new BigDecimal(10)),
new Beverage("Non-Alcoholic","Bottle","Coke",new BigDecimal(10)),
new Beverage("Non-Alcoholic","Can","Pepsi",new BigDecimal(10)),
new Beverage("Non-Alcoholic","Bottle","Pepsi",new BigDecimal(10)));
}
我想按类型、containerType和itemName对列表进行分组,并使用Java8流收集器和EntrySet对Quantity字段求和
输出应在ArrayList中,如所附屏幕截图所示
你能试着用这个吗
Map<String, Map<String, Map<String, Integer>>> result = beverages.stream()
.collect(Collectors.groupingBy(Beverage::getType,
Collectors.groupingBy(Beverage::getContainerType,
Collectors.groupingBy(Beverage::getItemName,
Collectors.summingInt(b -> b.getQuantity().intValue())))));
在这里,你可以找到一些关于我在这篇文章中找到shmosel答案的好方法,但它只包含2个字段,有没有一种方法我也可以这样做,但使用3个字段而不是2个?Sabareesh Muralidharan,它是有效的,但是我需要一个BigDecimal数据类型作为数量字段,你在求和时使用整数,其次,如何将“结果”转换为ArrayList。
Map<String, Map<String, Map<String, Integer>>> result = beverages.stream()
.collect(Collectors.groupingBy(Beverage::getType,
Collectors.groupingBy(Beverage::getContainerType,
Collectors.groupingBy(Beverage::getItemName,
Collectors.summingInt(b -> b.getQuantity().intValue())))));
{Non-Alcoholic={
Can={
Coke=20,
Pepsi=10
},
Bottle={
Coke=10,
Pepsi=10
}
},
Alcoholic={
Can={
Tecate=5,
Budweiser=15
},
Bottle={
Tecate=26,
Budweiser=35
}
}
}