Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按三个字段分组,然后使用Java8流收集器和EntrySet对BigDecimal求和_Java_Java Stream - Fatal编程技术网

按三个字段分组,然后使用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
                     }
               }
   }