Предположим, что у меня есть Collection
и a Predicate
, которые соответствуют элементам, которые я хотел бы удалить из Collection
. Но я не просто хочу их отбросить, я хочу переместить элементы, соответствующие друг другу, в новую коллекцию. Я бы сделал что-то вроде this в Java 7:
List<E> removed = new LinkedList<>();
for (Iterator<E> i = data.iterator(); i.hasNext();) {
E e = i.next();
if (predicate.test(e)) {
removed.add(e);
i.remove();
}
}
Мне любопытно, есть ли способ streams/Java 8 для этого. Collections.removeIf()
, к сожалению, просто возвращает boolean
(даже не подсчет количества удаленных элементов?) Плохо. Я представляю себе что-то вроде это (хотя, конечно, .removeAndYield(Predicate)
не существует):
List<E> removed = data.removeAndYield(predicate).collect(Collectors.toList());
Примечание: этот вопрос был вдохновлен аналогичным вопросом; этот вопрос касается более общего случая получения потока над элементами, удаленными из коллекции. Как указано в связанном вопросе, императивное решение может быть более читаемым, но мне любопытно, возможно ли это с потоками.
Изменить: Очевидно, что мы можем разделить задачу на два отдельных шага, и при условии, что соответствующие структуры данных будут эффективными. Вопрос в том, может ли это быть сделано для произвольных коллекций (которые могут не иметь эффективных .contains()
и т.д.).