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 .