如何初始化枚举映射中的计数?

时间:2015-03-24 18:06:18

标签: java enums java-8 java-stream

问题:我希望生成的地图包含所有可用的enums,如果在迭代列表中找不到,则使用long = 0进行预初始化。

List<Basket> basket;

Map<TypeOfGoods, Long> counts = basket.stream
      .collect(Collectors.groupingBy(Basket::getGoodsType, Collectors.counting()));

enum TypeOfGoods {
    FRUITS, TOYS;
}

在此示例中,地图将仅包含实际在篮子中找到的类型,但缺少任何其他枚举。我怎么能包括这些?

2 个答案:

答案 0 :(得分:4)

尝试:

Map<TypeOfGoods, Long> counts = Arrays.stream(TypeOfGoods.values())
                        .collect(Collectors.toMap(identity(), x -> 0L));
counts.putAll(basket.stream
  .collect(Collectors.groupingBy(Basket::getGoodsType, Collectors.counting()));

答案 1 :(得分:2)

另一种选择是使用putIfAbsent

Map<TypeOfGoods, Long> counts = basket.stream()
                .collect(groupingBy(Basket::getGoodsType, counting()));

Arrays.asList(TypeOfGoods.values()).forEach(e -> counts.putIfAbsent(e, 0L));