使用 List Stream 过滤器与 for 循环

Using List Stream filter vs for loop

在 java 8 中,您现在可以在一个列表上使用过滤器以根据您提供的 Predicate 获取另一个列表。

所以假设我有像这样的正常 for 循环逻辑

for(Person p : personList){
    if(p.getName().Equals("John")){
         //do something with this person
    }
}

现在使用这样的过滤器

List<Person> johnList = personList.stream()
    .filter(p -> p.getName().Equals("John"))
    .collect(Collectors.toList()); 

for(Person john : johnList){
    //do something with this person
}

似乎使用过滤器会比仅使用常规 for 循环造成更多开销,因为它不仅在第一次循环遍历整个列表,而且随后您必须循环遍历过滤后的列表并执行您想要的操作过滤后的列表。

我对它的工作原理有误吗?

按你现在的方式去做确实不是一个好主意。但这不是你应该做的。正确的方法是

personList.stream()
          .filter(p -> p.getName().equals("John"))
          .forEach(p -> doSomethingWithPerson(p));

对列表进行一次传递,不创建任何其他列表。

是的,因为您只完成了一半的工作。将第一个循环翻译成Java8,结果是

personList.stream()
    .filter(p -> p.getName().Equals("John"))
    .forEach(person -> // ...);

无需 "collecting" 筛选元素。