簡単に条件付きの数のGROUPBYのJavaストリームを使用して実装する方法

趙Binjie:

私は、次のデータ(クラス構造)を持っています:

[
  {
    "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}
また:

あなたは、単に条件によってフィルタリングされたオブジェクトをカウントされる可能性があります。

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=338594&siteId=1