プログラムを作っていて、リスト同士を比較なんてことはよくあることだと思います。
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メソッドの実装は省略
}
実装
処理の流れは下記の通り
- 両クラスに存在する色コードを抽出
- 一致した色コードを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するので、消えると困る場合は別途退避してください。