1. 概要

この短いチュートリアルでは、Javaで等しいオブジェクトをグループ化し、それらの発生をカウントする方法を説明します。 JavaではgroupingBy()コレクターを使用します。

2. Collectors.groupingBy()を使用してオカレンスをカウントします

Collectors.groupingBy()は、SQLのGROUP BY句と同様の機能を提供します。これを使用して、任意の属性でオブジェクトをグループ化し、結果をMapに格納できます。

たとえば、ストリーム内の等しい String をグループ化し、それらの発生をカウントする必要があるシナリオを考えてみましょう。

List<String> list = new ArrayList<>(Arrays.asList("Foo", "Bar", "Bar", "Bar", "Foo"));

等しい文字列をグループ化できます。この場合は「Foo」と「Bar」になります。 結果のMapは、これらの文字列をキーとして保存します。 これらのキーの値は、発生回数になります。 「Foo」の値は2になり、「Bar」の値は3になります。

Map<String, Long> result = list.stream()
  .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Assert.assertEquals(new Long(2), result.get("Foo"));
Assert.assertEquals(new Long(3), result.get("Bar"));

上記のコードスニペットをデコードしてみましょう。

  • 地図結果 –これは出力結果です地図グループ化された要素をキーとして保存し、それらの出現を値としてカウントします
  • list.stream()– w eリスト要素をJavaストリームに変換して、宣言的な方法でコレクションを処理します
  • Collectors.groupingBy() –これは、 Collectors クラスのメソッドであり、オブジェクトをプロパティでグループ化し、結果をMapインスタンスに格納します。
  • Function.identity()–これはJavaの機能インターフェイスです。 アイデンティティメソッドは、常に入力引数を返す関数を返します
  • Collectors.counting() –この Collectors クラスのメソッドは、ストリームで渡された要素の数をパラメーターとしてカウントします

使用できます Collectors.groupingByConcurrent() それ以外の Collectors.groupingBy()。 また、入力ストリーム要素に対してgroupby操作を実行します。 このメソッドは結果をConcurrentMapに収集するため、効率が向上します。

たとえば、入力リストの場合:

List<String> list = new ArrayList<>(Arrays.asList("Adam", "Bill", "Jack", "Joe", "Ian"));

Collectors.groupingByConcurrent()を使用して、同じ長さの文字列をグループ化できます。

Map<Integer, Long> result = list.stream()
  .collect(Collectors.groupingByConcurrent(String::length, Collectors.counting()));
Assert.assertEquals(new Long(2), result.get(3));
Assert.assertEquals(new Long(3), result.get(4));

3. 結論

この記事では、 Collector.groupingBy()を使用して等しいオブジェクトをグループ化する方法について説明しました。

最後に、この記事のソースコードはGitHubにあります。