【问题标题】:Group by three fields then summing BigDecimal using Java8 Stream Collectors and EntrySet [duplicate]按三个字段分组,然后使用 Java8 Stream Collectors 和 EntrySet 求和 BigDecimal [重复]
【发布时间】:2020-06-25 15:22:46
【问题描述】:

我有一个饮料数组列表

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)));

我的饮料 POJO 是

public class Beverage {
private String type;
private String containerType;   
private String itemName;
private BigDecimal quantity;
public Beverage(String type, String containerType, String itemName, BigDecimal quantity) {
    this.type = type;
    this.containerType = containerType;
    this.itemName = itemName;
    this.quantity = quantity;
}
public Beverage() {
}

}

我想按类型、containerType 和 itemName 对列表进行分组,并使用 Java8 Stream 收集器和 EntrySet 对 quatity 字段求和。

输出应在 ArrayList 中,如所附屏幕截图所示

【问题讨论】:

标签: java java-stream


【解决方案1】:

你可以试试这个,

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
                     }
               }
   }

【讨论】:

  • Sabareesh Muralidharan,它正在工作,但是我需要一个 BigDecimal 数据类型作为数量字段,而您在求和过程中使用了整数,其次,如何将“结果”转换为 ArrayList。
猜你喜欢
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 2018-07-24
  • 2021-11-04
  • 2021-10-27
相关资源
最近更新 更多