【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 を使っています。コメントデータの処理方法の詳細はこちらをご覧ください