【发布时间】:2021-05-22 18:55:27
【问题描述】:
我想知道java的流API处理这两种情况的方式是相同的还是不同的?如果它要为每个过滤器执行一个独立的循环,那么我认为在性能方面存在显着差异。你觉得怎么样?
这是两个条件
1. filter(cond1 && cond2 && cond3)
2. filter(cond1).filter(cond2).filter(cond3)
例子
List<Employee> emps1 = employees.stream()
.filter((Employee e) -> e.name.endsWith("n") && e.salary > 10000 && e.id % 2 == 1)
.collect(Collectors.toList());
List<Employee> emps2 = employees.stream()
.filter(e -> e.name.endsWith("n"))
.filter(e -> e.salary > 10000)
.filter(e -> e.id % 2 == 1)
.collect(Collectors.toList());
【问题讨论】:
-
读取选项,第一个将与“ands”连接的条件应用于整个数据,其他将 cond1 应用于整个数据,其他每个应用于缩减集。我对你的建议是用你拥有的数据来衡量自己——我想即使你交换条件顺序,它们也会出现差异。
-
TLDR:编译器处理它的方式不同。我们可以参考这个stackoverflow.com/a/48513110/1285923。他们在字节码级别对编译器如何处理它进行了分析。性能方面,IMO 不会有太大差别,唯一的优化是在算子短路上。
-
在更容易阅读的地方编写代码,第二个似乎是这样做的方式。性能方面,几乎没有差异
-
任何性能问题只有通过基准测试才能真正得到回答。假设只能到此为止。我建议你对代码进行基准测试并找出答案。
标签: java java-8 java-stream