首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解Java 8/9函数编程中的Map和Reduce (lambda表达式)。map()和reduce()如何提高性能?

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

Stack Overflow用户
提问于 2017-08-01 06:47:19
回答 1查看 217关注 0票数 1

这一行函数式编程代码做了:2*3 + 4*3 + 6*3 + 8*3 + 10*3操作。

代码语言:javascript
复制
 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的代码更有表现力。

代码语言:javascript
复制
int sum=0;
for(int i=1; i<=10;i++) {
   if(i%2 == 0) {
      sum=sum+i*3; 
      }
    }
System.out.println(sum); /* prints 90 */
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-01 07:43:40

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

对于Predicate,将生成一个.class (在调用类时,您可以通过-Djdk.internal.lambda.dumpProxyClasses=/Your/Path参数集看到它)。

对于用于Function操作的map也是如此。

因为您的lambda是stateless,所以将为每个操作创建和重用PredicateFunction的单个实例。如果是有状态的lambda,那么将为处理的每个元素生成一个新的实例。

从您的问题标题中,mapreduce不会提高性能(除非有大量的元素,并且您可以将流程并行化)。您的简单循环会更快,但不会比流快得多。您还选择了一个非常简单的示例--假设您选择了一个执行一些繁重的grouping,然后是自定义的collection等的示例--通过stream的简单方法的冗长性将是非常重要的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45430767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档