【问题标题】:Using List Stream filter vs for loop使用列表流过滤器与 for 循环
【发布时间】:2015-04-10 22:51:00
【问题描述】:

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

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

【问题讨论】:

  • 如有疑问,请进行基准测试。

标签: java list java-stream


【解决方案1】:

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

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

对列表进行单次传递,不会创建任何额外的列表。

【讨论】:

    【解决方案2】:

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

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

    无需“收集”过滤后的元素。

    【讨论】:

      猜你喜欢
      • 2021-10-17
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-22
      相关资源
      最近更新 更多