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

Udd*_*tam 1 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 */
Run Code Online (Sandbox Code Playgroud)

我明白它在做什么.我想知道在内存分配方面发生了什么?我们可以使用与上述操作相似的旧替代方案.这很容易理解,但基于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 */
Run Code Online (Sandbox Code Playgroud)

Eug*_*ene 5

首先,lambda expressions将对类文件中的静态方法进行去糖处理(用于javap查看).

因为Predicate将会.class生成(您可以-Djdk.internal.lambda.dumpProxyClasses=/Your/Path在调用类时通过参数集查看).

同样的事情会在Functionmap操作.

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

从您的问题标题中map,reduce不要提高性能(除非有大量的元素,您可以将流程并行化并带来好处).您简单的循环会更快-但不是比流快得多.你还选择了一个非常简单的例子 - 假设你选择了一个做一些重量grouping然后是自定义collection等的例子- 简单方法的详细程度stream就很重要了.