1. Обзор
В этом кратком руководстве мы узнаем о различных способах, с помощью которых мы можем работать с элементом в потоке Java 8, а затем удалить его после завершения операции.
2. Настройка
Давайте определим наши Пункт сначала объект. Это простой объект с одним полем int .
Он имеет метод, который определяет, подходит ли объект для работы, на основе внутреннего значения:
class Item { private int value; // constructors public boolean isQualified() { return value % 2 == 0; } public void operate() { System.out.println("Even Number"); } }
Теперь мы можем создать источник для нашего потока , который может быть коллекцией Предметы:
List- itemList = new ArrayList<>(); for (int i = 0; i < 10; i++) { itemList.add(new Item(i)); }
3. Фильтрация Элементов
Во многих случаях, если мы хотим что-то сделать с подмножеством элементов, мы можем использовать Поток#фильтр метод, и нам не нужно ничего удалять в первую очередь:
itemList.stream() .filter(item -> item.isQualified()) ...
4. Эксплуатация и удаление изделия
4.1. Сбор.Удаление
Мы можем использовать Потоки для итерации и работы над коллекцией Пункты .
Используя Streams , мы можем применять лямбда-функции, известные как Предикаты . Чтобы узнать больше о потоках и Предикатах , у нас есть еще одна статья здесь .
Мы можем создать Предикат , который определит, подходит ли Элемент для работы с ним:
Predicate- isQualified = item -> item.isQualified();
Наш Предикат будет фильтровать Элементы , с которыми мы хотим работать:
itemList.stream() .filter(isQualified) .forEach(item -> item.operate());
Как только мы закончим работать с элементами в потоке, мы сможем удалить их, используя тот же самый Предикат , который мы использовали ранее для фильтрации:
itemList.removeIf(isQualified);
Внутренне removeIf использует Итератор для перебора списка и сопоставления элементов с помощью предиката. Теперь мы можем удалить все совпадающие элементы из списка.
4.2. Сбор.Удаление всех
Мы также можем использовать другой список для хранения элементов, которые были обработаны, а затем удалить их из исходного списка:
List- operatedList = new ArrayList<>(); itemList.stream() .filter(item -> item.isQualified()) .forEach(item -> { item.operate(); operatedList.add(item); }); itemList.removeAll(operatedList);
В отличие от removeIf , который использует итератор, remove All использует простой for-loop для удаления всех совпадающих элементов в списке.
5. Заключение
В этой статье мы рассмотрели способ работы с элементом в потоках Java 8, а затем его удаления. Мы также увидели способ сделать это, используя дополнительный список и удалив все совпадающие элементы.
Исходный код этого руководства и соответствующие тестовые примеры доступны на GitHub .