Javaの2つのリストの交差

1. 概要

このチュートリアルでは、2つの__List__sの共通部分を取得する方法を学習します。
他の多くのことと同様に、これはlink:/java-streams[Java 8のストリーム]の導入のおかげではるかに簡単になりました。

2. 2つの文字列リストの交差点

いくつかの交差点を持つ__String__sの2つの__List__sを作成してみましょう両方ともいくつかの重複した要素を持ちます:
List<String> list = Arrays.asList("red", "blue", "blue", "green", "red");
List<String> otherList = Arrays.asList("red", "green", "green", "yellow");
そして*ストリームメソッドを使用してリストの共通部分を決定します*:
Set<String> result = list.stream()
  .distinct()
  .filter(otherList::contains)
  .collect(Collectors.toSet());

Set<String> commonElements = new HashSet(Arrays.asList("red", "green"));

Assert.assertEquals(commonElements, result);
まず、_distinct_で重複した要素を削除します。 次に、_filter_を使用して、_otherList_にも含まれている要素を選択します。
最後に、出力を_Collector_で変換します。 共通部分には、各共通要素を1回だけ含める必要があります。 順序は重要ではないため、_toSet_が最も簡単な選択ですが、_toList_または別のコレクターメソッドを使用することもできます。
詳細については、https://www.baeldung.com/java-8-collectors [Java 8’s Collectorsガイド]をご覧ください。

3. カスタムクラスのリストの交差点

__List__sに__String__sではなく、作成したカスタムクラスのインスタンスが含まれている場合はどうなりますか? さて、Javaの規約に従う限り、ストリームメソッドを使用したソリューションは、カスタムクラスに対して正常に機能します。
  • _contains_メソッドは、特定のオブジェクトがリストに表示されるかどうかをどのように決定しますか? _equals_メソッドに基づいています。 したがって、_equals_メソッドをオーバーライドし、関連するプロパティの値に基づいて2つのオブジェクトを比較することを確認する必要があります。*

    たとえば、幅と高さが等しい場合、2つの長方形は等しくなります。
    _equals_メソッドをオーバーライドしない場合、クラスは親クラスの_equals_実装を使用します。 1日の終わり、または継承チェーンで、_Object_クラスの_equals_メソッドが実行されます。 2つのインスタンスは、ヒープ上のまったく同じオブジェクトを参照する場合にのみ等しくなります。
    _equals_メソッドの詳細については、link:/java-equals-hashcode-contracts[Java _equals()_ and _hashCode()_ Contracts]の記事を参照してください。

4. 結論

この簡単な記事では、ストリームを使用して2つのリストの共通部分を計算する方法を見てきました。 以前は非常に退屈でしたが、Java Stream APIの方法を知っている場合は非常に簡単な操作が他にもたくさんあります。 link:/java-streams[Javaストリームの詳細なチュートリアルはこちら]をご覧ください。
コード例はhttps://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-collections-list-2[GitHubで]で入手できます。