java-8过滤列表而不创建新列表

Eri*_*uth 15 java lambda list java-8

我正在寻找最简洁的方法来过滤Java-8中的列表,使用简单的lambda Predicate,而无需创建新列表.

特别是,这个解决方案不适合,因为toList()返回一个新的List:

List<Person> beerDrinkers = persons.stream()
    .filter(p -> p.getAge() > 16)
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

请注意,以下解决方案也不起作用,因为列表应该是clear()其原始值的ed(但显然,如果过滤之前清除它,则没有任何内容可以过滤...):

persons.stream()
    .filter(p -> p.getAge() > 16)
    .forEach((p) -> persons.add(p));
Run Code Online (Sandbox Code Playgroud)

(另外,我更喜欢不涉及使用第三方库或框架的解决方案)

JB *_*zet 25

beerDrinkers.removeIf(p -> p.getAge() <= 16);
Run Code Online (Sandbox Code Playgroud)

  • 没必要道歉.不要删除评论.在处理默认方法时问自己这样一个问题是有用的,它可能会清除未来读者的疑虑.我自己必须检查文档(和代码)以确保ArrayList覆盖该方法. (5认同)
  • @JBNizet Apologies,我认为这将有一个'ArrayList`的O(n²),因为ArrayList上的'remove(E)`的O(n),但事实上,`removeIf`有一个专用的实现.在`ArrayList`中,使用`BitSet`首先找出要删除的元素,然后在一次运行中压缩`ArrayList`的元素.现在我考虑删除上面的注释(和这个注释),尽管对于任何`remove(E)`是O(n)操作并且使用`removeIf`的*default*实现的列表它仍然是真的.在`Collection`界面中定义... (4认同)
  • @ Marco13它不会与ArrayList或LinkedList一起使用,后者是迄今为止最常用的列表。您是否在考虑特定的List实现? (2认同)