Перейти к основному содержимому

Работа с элементом и его удаление из потока

· 3 мин. чтения

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

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

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

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

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

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

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

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

itemList.removeIf(isQualified);

Внутренне removeIf использует итератор для перебора списка и сопоставления элементов с помощью предиката. Теперь мы можем удалить любые соответствующие элементы из списка.

4.2. Коллекция.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 .