Как легко реализовать условный подсчет в групповом режиме, используя Java Stream - PullRequest
0 голосов
/ 20 марта 2020

У меня есть следующие данные (структура класса A):

[
  {
    "name": "a",
    "enable": true
  },
  {
    "name": "a",
    "enable": false
  },
  {
    "name": "b",
    "enable": false
  },
  {
    "name": "b",
    "enable": false
  },
  {
    "name": "c",
    "enable": false
  }
]

Как заменить приведенный ниже сложный код простым паром:

List<A> list = xxxxx;
Map<String, Integer> aCountMap = new HashMap<>();
list.forEach(item -> {
    Integer count = aCountMap.get(item.getName());
    if (Objects.isNull(count)) {
        aCountMap.put(item.getName(), 0);
    }
    if (item.isEnable()) {
        aCountMap.put(item.getName(), ++count);
    }
});

Правильный результат выглядит следующим образом:

{"a":1}
{"b":0}
{"c":0}

1 Ответ

3 голосов
/ 20 марта 2020

Возможно, вы просто подсчитываете объекты, отфильтрованные по условию:

Map<String, Long> aCountMap = list.stream()
        .filter(A::isEnable)
        .collect(Collectors.groupingBy(A::getName, Collectors.counting()));

Но так как вы также ищете счет 0, Collectors.filtering с Java -9 + предоставляет вам реализация, такая как:

Map<String, Long> aCountMap = List.of().stream()
        .collect(Collectors.groupingBy(A::getName,
                Collectors.filtering(A::isEnable,
                        Collectors.counting())));
...