【发布时间】:2015-07-13 21:36:12
【问题描述】:
我有一个方法可以打印给定列表中一个人的 name,如果它具有指定的 age。此方法是使用命令式然后函数式方法实现的。
public static void printPerson(int age) {
for(Person p: list) {
if(p.age == age) {
System.out.println(p.name)
}
}
}
功能方法:
public static void printPerson(int age) {
list.stream()
.filter(p -> p.age == age)
.forEach(p -> System.out.println(p.name));
}
问题是,除了可读性之外,我们还能如何比较这两种方法,以及对这些属性中的每一个的评估是什么。 例如,哪一个具有更高的内存占用,哪一个引入的开销最小,或者具有更高的响应时间。可以讨论哪些其他属性(即非功能性需求)?
【问题讨论】:
-
看起来像 C++,确定要使用“Java”标签吗?
-
@bakoyaro 自 Java 8 以来最后一个代码编译为 lambda expressions。
-
This post 可能对这个问题感兴趣。
-
普通循环几乎在所有方面都更好。在这个时候,Stream 肯定被滥用了,因为它是一个闪亮的新玩具。
-
两者都是同样糟糕的混合分离与副作用匹配的元素。如果您将这些拆分为 getPersonsByAge、printPersons 并就地替换您的方法 printPersonsByAge,您会发现流版本会很小,使用更少的内存并立即开始生成输出,而在您的命令式版本中需要使用 anwer 进行集合从一个传递到另一个会导致更高的内存使用率,并且在过滤所有元素之前您不会看到输出。
标签: java functional-programming imperative-programming