Рубрики
Без рубрики

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

Узнайте о различных способах, которыми мы можем работать с элементом в потоке Java 8, а затем удалить его после завершения операции.

Автор оригинала: baeldung.

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 .