プログラムを作っていて、リスト同士を比較なんてことはよくあることだと思います。
List<String>の比較はよく見ますが、List<Class>の比較はあまり見かけず忘れてしまうのでメモとして残します。
ゴール
「Aクラス」と「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メソッドの実装は省略
}
実装
処理の流れは下記の通り
- 両クラスに存在する色コードを抽出
- 一致した色コードをremoveAllメソッドに渡して削除
- 一致したものは削除されているので、残ったデータはすべて不一致のもの
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するので、消えると困る場合は別途退避してください。