Java 8におけるコレクションの新しいremoveIfメソッド

Java 8以降、CollectionインターフェースとそのサブクラスにremoveIfメソッドが追加されました。このメソッドは、特定の条件を満たす要素をコレクションから削除する機能を提供します。以下では、removeIfメソッドの使用方法を説明します。

public class Worker {
    private String name;
    private int age;
    private String sex;
    
    // コンストラクタ、getter、setterは省略
    
    @Override
    public String toString() {
        return "Worker{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}

上記のWorkerクラスは、名前(name)、年齢(age)、性別(sex)の3つのプロパティを持ちます。今回は、年齢が30歳以上の応募者をフィルタリングします。

従来のIteratorを使用した方法は以下のとおりです:

Collection<Worker> applicants = new ArrayList<>();
applicants.add(new Worker("山田", 28, "男性"));
applicants.add(new Worker("鈴木", 24, "女性"));
applicants.add(new Worker("佐藤", 35, "男性"));
applicants.add(new Worker("田中", 32, "女性"));
applicants.add(new Worker("铃木", 29, "男性"));

Iterator<Worker> iterator = applicants.iterator();
while (iterator.hasNext()) {
    Worker worker = iterator.next();
    if (worker.getAge() >= 30) {
        iterator.remove();
    }
}

System.out.println(applicants.toString());

一方、removeIfメソッドを使用した方法は以下です:

Collection<Worker> applicants = new ArrayList<>();
applicants.add(new Worker("山田", 28, "男性"));
applicants.add(new Worker("鈴木", 24, "女性"));
applicants.add(new Worker("佐藤", 35, "男性"));
applicants.add(new Worker("田中", 32, "女性"));
applicants.add(new Worker("铃木", 29, "男性"));

applicants.removeIf(worker -> worker.getAge() >= 30);

System.out.println(applicants.toString());

removeIfメソッドとラムダ式を組み合わせることで、条件に一致する要素を簡単に削除できます。上記の例では、30歳以上の佐藤と田中が削除され、結果は以下のようになります。

[Worker{name='山田', age=28, sex='男性'}, Worker{name='鈴木', age=24, sex='女性'}, Worker{name='铃木', age=29, sex='男性'}]

ラムダ式に慣れていない場合は、Predicateインターフェースを実装したオブジェクトをremoveIfに渡すことも可能です。以下にその例を示します:

Collection<Worker> applicants = new ArrayList<>();
applicants.add(new Worker("山田", 28, "男性"));
applicants.add(new Worker("鈴木", 24, "女性"));
applicants.add(new Worker("佐藤", 35, "男性"));
applicants.add(new Worker("田中", 32, "女性"));
applicants.add(new Worker("铃木", 29, "男性"));

applicants.removeIf(new Predicate<Worker>() {
    @Override
    public boolean test(Worker worker) {
        return worker.getAge() >= 30;
    }
});

System.out.println(applicants.toString());

この方法でも同じ結果が得られます。

タグ: Java8 removeIf コレクション ラムダ式 predicate

9月14日 19:12 投稿