【发布时间】:2015-07-29 20:38:53
【问题描述】:
在 Java 8 lambda 表达式中使用 filter(Predicate<? super T> predicate) 调用时,我有两种想法:是将所有 Predicate 逻辑放在一个调用中,还是在适当的情况下链接 filter(Predicate<? super T> predicate) 调用以提高可读性。
我认为链接filter(Predicate<? super T> predicate) 调用会很便宜,因为它们还没有遇到终止符,所以在可读性方面会犯错误,但我对我对Streams API 的了解不够自信,无法完全理解权衡是什么。
借助以下示例(考虑过于复杂的谓词),哪个实现更好:List<Person> usingOneFilter 或 List<Person> usingTwoFilters?
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class SEExample {
private static class Person {
private final int age;
private final int heightInCm;
public Person(int age, int heightInCm) {
this.age = age;
this.heightInCm = heightInCm;
}
public int getAge() {
return age;
}
public int getHeight() {
return heightInCm;
}
}
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person(14, 140),
new Person(15, 140),
new Person(16, 150),
new Person(17, 120));
List<Person> usingOneFilter = people
.stream()
.filter(p -> p.getAge() >= 16 && p.getHeight() >= 130)
.collect(Collectors.toList());
List<Person> usingTwoFilters = people
.stream()
.filter(p -> p.getAge() >= 16)
.filter(p -> p.getHeight() >= 130)
.collect(Collectors.toList());
}
}
【问题讨论】:
-
一个六个,另一个六个。没有真正的区别;没关系。
-
嗨,路易斯,感谢您的意见。根据您的评论,我假设从性能的角度来看它几乎相同。在这种情况下,您是否同意多个过滤器调用可以提高可读性,特别是如果其中有很多布尔逻辑?
-
可能吗?具体情况我得看,肯定是不同的开发者会有不同的看法。
标签: java lambda java-8 java-stream