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

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

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");
    }
}

Теперь мы можем создать источник для нашегоStream, который может быть коллекциейItems:

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

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

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

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

НашPredicate отфильтруетItems, с которыми мы хотим работать:

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

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

itemList.removeIf(isQualified);

Internally, removeIf uses an Iterator to iterate over the list and match the elements using the predicate. Теперь мы можем удалить любые совпадающие элементы из списка.

4.2. Collection.removeAllс

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

List operatedList = new ArrayList<>();
itemList.stream()
  .filter(item -> item.isQualified())
  .forEach(item -> {
    item.operate();
    operatedList.add(item);
});
itemList.removeAll(operatedList);

В отличие отremoveIf, который использует итератор,removeAll uses a simple for-loop to remove all the matching elements in the list.

5. Заключение

В этой статье мы рассмотрели способ работы с элементом в Java 8 Streams, а затем его удаление. Мы также нашли способ сделать это, используя дополнительный список и удалив все соответствующие элементы.

Исходный код этого руководства и соответствующие тестовые примеры доступныover on GitHub.