ストリームに対するアイテムの操作と削除

Streamでのアイテムの操作と削除

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");
    }
}

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

List 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と呼ばれるラムダ関数を適用できます。 StreamsPredicatesの詳細については、別の記事hereがあります。

Itemが操作される資格があるかどうかを判断するPredicateを作成できます。

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

Predicateは、操作するItemsをフィルタリングします。

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

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

itemList.removeIf(isQualified);

Internally, removeIf uses an Iterator to iterate over the list and match the elements using the predicate.これで、一致する要素をリストから削除できます。

4.2. Collection.removeAll

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

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

イテレータを使用するremoveIfとは異なり、removeAll uses a simple for-loop to remove all the matching elements in the list.

5. 結論

この記事では、Java 8 Streamsでアイテムを操作してから削除する方法を検討しました。 また、追加のリストを使用して、一致するすべての要素を削除する方法も見ました。

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