1. 概要

このクイックチュートリアルでは、Java 8ストリーム内のアイテムを操作し、操作が完了したらアイテムを削除するさまざまな方法について学習します。

2. 設定

最初にItemオブジェクトを定義しましょう。 これは、単一のintフィールドを持つ単純なオブジェクトです。

内部値に基づいて、オブジェクトが操作に適格であるかどうかを判断するメソッドがあります。

class Item {
    private int value;

    // constructors

    public boolean isQualified() {
        return value % 2 == 0;
    }

    public void operate() {
        System.out.println("Even Number");
    }
}

これで、 Stream のソースを作成できます。これは、 Items:のコレクションになります。

List<Item> itemList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    itemList.add(new Item(i));
}

3. アイテムのフィルタリング

多くの場合、アイテムのサブセットを使用して何かを実行する場合は、 Stream#filter メソッドを使用でき、最初に何も削除する必要はありません。

itemList.stream()
  .filter(item -> item.isQualified())
  ...

4. アイテムの操作と削除

4.1. Collection.removeIf

Streams を使用して、Itemsのコレクションを反復処理することができます。

Streams を使用して、Predicatesと呼ばれるラムダ関数を適用できます。 ストリーム述語の詳細については、別の記事ここがあります。

Itemが操作に適格かどうかを判断するPredicateを作成できます。

Predicate<Item> isQualified = item -> item.isQualified();

述語は、操作するアイテムをフィルタリングします。

itemList.stream()
  .filter(isQualified)
  .forEach(item -> item.operate());

ストリーム内のアイテムの操作が終了したら、以前にフィルタリングに使用したのと同じPredicateを使用してアイテムを削除できます。

itemList.removeIf(isQualified);

内部的に、removeIfはイテレータを使用してリストを反復処理し、述語を使用して要素を照合します。一致する要素をリストから削除できるようになりました。

4.2. Collection.removeAll

別のリストを使用して、操作された要素を保持し、元のリストからそれらを削除することもできます。

List<Item> operatedList = new ArrayList<>();
itemList.stream()
  .filter(item -> item.isQualified())
  .forEach(item -> {
    item.operate();
    operatedList.add(item);
});
itemList.removeAll(operatedList);

イテレータを使用するremoveIfとは異なり、 removeAllは単純なforループを使用して、リスト内の一致するすべての要素を削除します。

5. 結論

この記事では、Java 8 Streamsでアイテムを操作し、それを削除する方法について説明しました。 また、追加のリストを使用し、一致するすべての要素を削除することで、それを行う方法も確認しました。

このチュートリアルのソースコードと関連するテストケースは、GitHubから入手できます。