Comment mettre en œuvre facilement le nombre conditionnel dans groupby en utilisant Java flux

Zhao Binjie:

J'ai les données suivantes (une structure de classe):

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

Comment puis-je remplacer le code ci-dessous complexe avec une vapeur simple:

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

Le résultat correct est le suivant:

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

Vous pourriez simplement être comptiez les objets filtrés par une condition:

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

Mais puisque vous êtes à la recherche du 0comte ainsi, Collectors.filteringavec Java-9 + vous offre la mise en œuvre tels que:

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

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=338608&siteId=1
conseillé
Classement