【Java】独自クラスのリストを比較して、値が一致してないものを取り出す

プログラムを作っていて、リスト同士を比較なんてことはよくあることだと思います。

List<String>の比較はよく見ますが、List<Class>の比較はあまり見かけず忘れてしまうのでメモとして残します。

ゴール

クラスAクラスBの色コードプロパティを比較し、異なる色コードを持つクラスBのデータを抽出する。

実装クラス

下記のような、クラスAクラスBを用意しました。

クラスA

クラスAは、「色名」と「色コード」を持っているクラス。

Java
public class ClassA { private String colorName; // 色名 private String colorCode; // 色コード public ClassA(String colorName, String colorCode) { setColorName(colorName); setColorCode(colorCode); } // getter, setterメソッドの実装は省略
}

クラスB

クラスBは、「ニックネーム」と「色コード」を持っているクラス。

Java
public class ClassB { private String name; // 名前 private String colorCode; // 色コード public ClassB(String name, String colorCode) { setName(name); setColorCode(colorCode); } // getter, setterメソッドの実装は省略
}

実装

処理の流れは下記の通り

  1. 両クラスに存在する色コードを抽出
  2. 一致した色コードをremoveAllメソッドに渡して削除
  3. 一致したものは削除されているので、残ったデータはすべて不一致のもの
Java
public static void Main(String args[]) { // クラスAのリスト List<ClassA> classA = new ArrayList<>(); classA.add(new classA("red", "#ff0000")); classA.add(new classA("blue", "#0000ff")); classA.add(new classA("green", "#00ff00")); // クラスBのリスト List<ClassB> classB = new ArrayList<>(); classB.add(new ClassB("Yamada", "#ff0000")); classB.add(new ClassB("Koyama", "#0000ff")); classB.add(new ClassB("Sato", "#000000")); // 色名が一致してないものを取得 classB.removeAll(classB.stream() .filter(x -> classA.stream().anyMatch(y -> y.getColorCode().equals(x.getColorCode()))) .collect(Collectors.toList())); classB.forEach(x -> System.out.println(x.getName())); // 結果 // >> Sato
}

※上記ソースでは、元のリストに対してremoveAllするので、消えると困る場合は別途退避してください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください