2017-08-01 35 views
1

这一行函数式编程代码如下: 2 * 3 + 4 * 3 + 6 * 3 + 8 * 3 + 10 * 3操作。了解Java 8/9函数式编程中的Map和Reduce(lambda表达式)。 map()和reduce()如何提高性能?

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 */ 
+2

FYI:我删除了'Java的9'标签,因为您使用流API是不特定于Java 9.我接着说:java'。 – Nicolai

+0

感谢您的努力。 –

回答

5

首先lambda expressions将被取消加糖到你的类文件中的静态方法(使用javap看到)。

对于Predicate会有一个.class生成(您可以通过-Djdk.internal.lambda.dumpProxyClasses=/Your/Path参数集看,当你调用你的类。

同样的事情会发生在Functionmap操作。

由于您的lambda表达式是stateless会有Predicate和创建和重新用于每个操作Function的单个实例。如果它本来有状态的λ。 - 用于将被处理的每个元素可以产生一个新的实例

而且从你的问题标题mapreduce不提高性能(除非有吨的元素,你可以用一个好处并行化处理)。您简单的循环会更快 - 但不是比流快得多。您还选择了一个非常简单的例子 - 假设你选择做一些繁重的grouping,然后自定义collection,等一个例子 - 通过stream简单的方法的详细程度是显著。