«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.