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

Теперь мы можем создать источник для нашего потока, который может быть набором элементов:

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

Мы можем использовать потоки для итерации и работы с коллекцией элементов.

Используя потоки, мы можем применять лямбда-функции, известные как предикаты. Чтобы узнать больше о потоках и предикатах, у нас есть еще одна статья здесь.

Мы можем создать предикат, который будет определять, подходит ли объект для обработки:

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

Наш предикат будет фильтровать объекты, над которыми мы хотим работать:

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

После того, как мы закончим Работая с элементами в потоке, мы можем удалить их, используя тот же предикат, который мы использовали ранее для фильтрации:

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, который использует Iterator, removeAll использует простую for- цикла, чтобы удалить все соответствующие элементы в списке.

5. Заключение

В этой статье мы рассмотрели способ работы с элементом в Java 8 Streams и последующего его удаления. Мы также видели способ сделать это, используя дополнительный список и удаляя все соответствующие элементы.

Исходный код этого руководства и соответствующие тестовые примеры доступны на GitHub.