场景
Java8新特性-Stream对集合进行操作的常用API:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126070657
上面介绍Stream的相关使用示例。
如果遇到在lambda表达式内部访问在其外部定义的变量,比如一个求和算法
List<Integer> integers = Arrays.asList(1, 2, 4, 6, 7, 9); int total = 0; //采用传统的for-each循环对所有值求和 for (int n:integers ) { total +=n; } System.out.println(total);
除了采用传统for循环之外,如果想使用lambda表达式实现
total = 0; //forEach方法传入Consumer作为参数,如果Consumer试图修改tatal变量,则代码不会编译 //integers.forEach(integer -> total +=integer);//不通过编译
则代码不会通过编译。
必须将在 lambda 表达式内部访问的局部变量声明为 final,
或使其具备等同于 final 的效果(effectively final)。可以对特性(attribute)进行访问和修改。
在 Java 8 中,变量不必采用 final 修饰,但必须具备等同于final的效果。
换言之,任何试图修改局部变量值的代码都不会被编译。
可以通过将流转换为IntStream并调用sum方法。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
实现
total = integers.stream() .mapToInt(Integer::valueOf) .sum(); System.out.println(total);
标签:integers,mapToInt,编译,Java,total,final,表达式,lambda From: https://www.cnblogs.com/badaoliumangqizhi/p/17030217.html