使用列表流过滤器vs for循环

时间:2015-04-10 22:51:00

标签: java list java-stream

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

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

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循环导致更多开销,因为它不仅在第一次循环遍历整个列表,而且你必须循环遍历过滤后的列表并使用过滤器执行所需的操作列表。

我的工作方式不正确吗?

2 个答案:

答案 0 :(得分:6)

按照你做的方式做这件事确实不是一个好主意。但那并不是你应该怎么做的。正确的方法是

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

在列表上执行一次传递,并且不会创建任何其他列表。

答案 1 :(得分:4)

是的,因为你只做了一半的工作。将第一个循环转换为Java 8,结果是

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

无需&#34;收集&#34;过滤后的元素。