使用 Java 流删除和收集元素
2022-09-02 23:49:41
假设我有一个 ,和一个与我要从 中删除的元素匹配。但我不仅想丢弃它们,我还想将匹配的元素移动到新集合中。我会在Java 7中做这样的事情:Collection
Predicate
Collection
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();
}
}
我很好奇是否有流/ Java 8方法来做到这一点。不幸的是,Collections.removeIf()
只是返回一个(甚至没有计算已删除元素的数量?太糟糕了。我设想了这样的东西(虽然当然不存在):boolean
.removeAndYield(Predicate)
List<E> removed = data.removeAndYield(predicate).collect(Collectors.toList());
注意:这个问题的灵感来自一个类似的问题;这个问题是关于在从集合中删除的项目上获取流的更一般的情况。正如链接的问题中指出的那样,命令式解决方案可能更具可读性,但我很好奇这是否适用于流。
编辑:显然,我们可以将任务分为两个独立的步骤,并且假设适当的数据结构将是有效的。问题是,这是否可以在任意集合上完成(可能没有效率等)。.contains()