场景
Java8新特性-Stream对集合进行操作的常用API:
Java8新特性-Stream对集合进行操作的常用API_霸道流氓气质的博客-CSDN博客_streamapi对集合修改
上面介绍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方法。
注:
博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主
实现
total = integers.stream()
.mapToInt(Integer::valueOf)
.sum();
System.out.println(total);