2

我有一个方法可以从给定列表中打印一个人的姓名(如果它具有指定的年龄)。此方法是使用命令式然后是函数式方法来实现的。

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

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

4

2 回答 2

2

实际上,这并不重要,但是函数式方法会占用更高的内存和 CPU 使用率,因为与命令式方法相比,lambdas 相对昂贵。lambdas 实际上只是匿名内部类,因此您依赖 JVM 来优化方法调用,使其看起来像命令式版本。关于命令式编程要记住的一点是它看起来很像汇编,所以它往往运行得很快,几乎不需要额外的工作。

将来,一些操作map可以并行化,所以它有点面向未来。

但是请注意:有些事情在命令式上要干净得多,但是如果您过于专注于函数式编程,您可能会错过该解决方案。Stackoverflow 上有很多关于“我如何在 Guava 中做x ”的问题,答案是“你为什么要滥用 Guava 来用三行代码高效地使用 Java 的标准库来做这些事情?

于 2015-07-13T21:44:37.237 回答
0

很难回答在 Java 中,函数式方法的性能会随着实现的不同而有很大差异。

通常,使用函数范式,您可以消除副作用,并且可以轻松(以数学方式)证明函数可以做正确的事情。

就纯粹的性能(尤其是响应时间)而言,我认为函数式并不比命令式范式更快或不快。唯一重要的是:

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

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

于 2015-07-13T21:46:53.983 回答