理解Java 8/9函数式编程中的Map和Reduce(lambda表达式)。 map()和reduce()如何提高性能?

时间:2017-08-01 06:47:19

标签: java lambda functional-programming java-8

这一行功能编程代码可以: 2 * 3 + 4 * 3 + 6 * 3 + 8 * 3 + 10 * 3 操作。

 int sum = IntStream.rangeClosed(1,10) /* closed range */
            .filter(x -> x%2 == 0) /* filter to even numbers in range */
            .map(x -> x*3) /* map */
            .sum(); /* actual sum operation happens */
            System.out.println(sum); /* prints 90 */

我明白它在做什么。我想知道在内存分配方面发生了什么??我们可以使用与上述操作相似的旧替代方案。这很容易理解,但基于Lambda的代码更具表现力。

int sum=0;
for(int i=1; i<=10;i++) {
   if(i%2 == 0) {
      sum=sum+i*3; 
      }
    }
System.out.println(sum); /* prints 90 */

1 个答案:

答案 0 :(得分:5)

首先,lambda expressions将在您的类文件中去除静态方法(使用javap查看)。

对于Predicate,会生成.class(您可以在调用班级时通过-Djdk.internal.lambda.dumpProxyClasses=/Your/Path参数设置查看。

Function操作的map也是如此。

由于您的lambda为stateless,因此会为每个操作创建并重新使用PredicateFunction的单个实例。如果它是一个有状态的lambda - 将为每个处理的元素生成一个新实例。

从您的问题标题mapreduce不会提高效果(除非有大量元素,您可以将流程并行化并带来好处)。你的简单循环会更快 - 但 比流更快。您还选择了一个非常简单的示例 - 假设您选择了一个重量级grouping,然后是自定义collection等的示例 - 通过stream的简单方法的详细程度将是显着的。