我有一个方法可以打印某个人的名称,如果它具有指定的年龄。该方法使用命令式和功能性方法实现。
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));
}
问题是,除了可读性之外,我们还能比较这两种方法以及每种方法的评估结果。 例如,哪一个具有更高的内存占用,哪一个引入最少的开销,或者具有更高的响应时间。还可以讨论哪些其他属性(即非功能性要求)?
答案 0 :(得分:2)
在实践中,这没关系,但是你会有更高的内存占用和CPU使用功能方法,因为与命令式方法相比,lambda相对昂贵。 lambdas are actually just anonymous inner classes,因此您依赖于JVM来优化方法调用,使其看起来像命令式版本。关于命令式编程要记住的事情是它看起来很像汇编,所以它往往运行速度很快,只需要额外的工作。
将来,某些操作如map
可以并行化,因此它有点面向未来。
答案 1 :(得分:0)
很难回答在Java中,功能方法的性能会随着实现而变化很大。
但一般,通过功能范例,您可以消除副作用,并且您可以轻松地(以数学方式)证明某个函数可以执行权限。
就纯粹的表现(特别是响应时间)而言,我认为功能不是比命令式范式更快或更快。唯一重要的事情是:
至少,我不建议在Java中使用函数范例,lamdba表达式对于这种语言来说是年轻的。除非你喜欢它。