Как инициализировать счет в карте перечислений?

1

Проблема. Я хочу, чтобы результирующая карта содержала все доступные enums, а если не найдена в повторном списке, следует предварительно инициализировать long = 0.

List<Basket> basket;

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

enum TypeOfGoods {
    FRUITS, TOYS;
}

В этом примере карта будет содержать только те типы, которые действительно находятся в корзине, но отсутствуют какие-либо другие перечисления. Как я могу также включить их?

Теги:
java-8
java-stream
enums

2 ответа

2
Лучший ответ

Другой альтернативой было бы использование putIfAbsent:

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

Arrays.asList(TypeOfGoods.values()).forEach(e -> counts.putIfAbsent(e, 0L));
  • 0
    Это одно уродливое закрытие ;-)
  • 0
    @JeanLogeart Что уродливо?
Показать ещё 5 комментариев
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()));
  • 0
    Где функция constant() ? Все еще не мог найти это.
  • 0
    Я сделал изменение

Ещё вопросы

Сообщество Overcoder
Наверх
Меню