Java中命令式和功能性方法的比较

时间:2015-07-13 21:36:12

标签: java functional-programming imperative-programming

我有一个方法可以打印某个人的名称,如果它具有指定的年龄。该方法使用命令式和功能性方法实现。

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));
}

问题是,除了可读性之外,我们还能比较这两种方法以及每种方法的评估结果。 例如,哪一个具有更高的内存占用,哪一个引入最少的开销,或者具有更高的响应时间。还可以讨论哪些其他属性(即非功能性要求)?

2 个答案:

答案 0 :(得分:2)

在实践中,这没关系,但是你会有更高的内存占用和CPU使用功能方法,因为与命令式方法相比,lambda相对昂贵。 lambdas are actually just anonymous inner classes,因此您依赖于JVM来优化方法调用,使其看起来像命令式版本。关于命令式编程要记住的事情是它看起来很像汇编,所以它往往运行速度很快,只需要额外的工作。

将来,某些操作如map可以并行化,因此它有点面向未来。

但请注意:有些事情要求更加清晰,但如果你过于专注于函数式编程,你可能会错过这个解决方案。在Stackoverflow上有很多关于“我如何在 x ”的问题,答案是“为什么你试图滥用Guava来做你可以用Java的标准库做三代码行?

答案 1 :(得分:0)

很难回答在Java中,功能方法的性能会随着实现而变​​化很大。

一般,通过功能范例,您可以消除副作用,并且您可以轻松地(以数学方式)证明某个函数可以执行权限。

就纯粹的表现(特别是响应时间)而言,我认为功能不是比命令式范式更快或更快。唯一重要的事情是:

  • 实施方式
  • 实现语言(以及Java,JVM)的方式。

至少,我不建议在Java中使用函数范例,lamdba表达式对于这种语言来说是年轻的。除非你喜欢它。