这一行功能编程代码可以: 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 */
答案 0 :(得分:5)
首先,lambda expressions
将在您的类文件中去除静态方法(使用javap
查看)。
对于Predicate
,会生成.class
(您可以在调用班级时通过-Djdk.internal.lambda.dumpProxyClasses=/Your/Path
参数设置查看。
Function
操作的map
也是如此。
由于您的lambda为stateless
,因此会为每个操作创建并重新使用Predicate
和Function
的单个实例。如果它是一个有状态的lambda - 将为每个处理的元素生成一个新实例。
从您的问题标题map
和reduce
不会提高效果(除非有大量元素,您可以将流程并行化并带来好处)。你的简单循环会更快 - 但 比流更快。您还选择了一个非常简单的示例 - 假设您选择了一个重量级grouping
,然后是自定义collection
等的示例 - 通过stream
的简单方法的详细程度将是显着的。