这一行函数式编程代码做了: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 */发布于 2017-08-01 07:43:40
首先,lambda expressions将被取消到类文件中的静态方法(使用javap查看)。
对于Predicate,将生成一个.class (在调用类时,您可以通过-Djdk.internal.lambda.dumpProxyClasses=/Your/Path参数集看到它)。
对于用于Function操作的map也是如此。
因为您的lambda是stateless,所以将为每个操作创建和重用Predicate和Function的单个实例。如果是有状态的lambda,那么将为处理的每个元素生成一个新的实例。
从您的问题标题中,map和reduce不会提高性能(除非有大量的元素,并且您可以将流程并行化)。您的简单循环会更快,但不会比流快得多。您还选择了一个非常简单的示例--假设您选择了一个执行一些繁重的grouping,然后是自定义的collection等的示例--通过stream的简单方法的冗长性将是非常重要的。
https://stackoverflow.com/questions/45430767
复制相似问题