java8for循环赋值,为什么java8的foreach循环中的变量应该是final?

本文探讨了Java 8中使用forEach循环时,为何要求内部变量必须是final或effectively final。这是由于Java内存模型确保局部变量不会被其他线程修改,而Lambda表达式可能在不同线程中执行,为保持安全性,不允许修改局部变量。在函数式编程中,可变变量被视为不良实践,建议使用Stream的减少方法来编写更优的函数式代码。
摘要由CSDN通过智能技术生成

I am iterating an array list in Java 7 loop and Java 8 forEach loop. Java 8 loop wants variable inside the loop to be final. For example,

List testList = Arrays.asList( "apple", "banana", "cat", "dog" );

int count = 0;

testList.forEach( test -> {

count++; // compilation Error : Local variable count defined in an enclosing scope must be final or effectively final

});

for( String test: testList ) {

count++; // No Error

}

Can someone explain why it is so ? Is it a drawback of Java 8 ?

解决方案

The Java Memory Model has very important property: it guarantees that local variables and method parameters are never writable by another thread. This adds much safety to multi-threading programming. However when you create a lambda (or an anonymous class), nobody knows how it will be used. It can be passed to another thread for execution (for example, if you use parallelStream().forEach(...)). Were it possible to modify the local variable that important property would be violated. Not the thing the Java language developers would sacrifice.

Usually when you are using lambdas, you are trying to program in functional way. But in functional programming mutable variables are considered bad practice: it's better to assign every variable only once. So trying to modify the local variable actually smells. Use various stream reduction methods instead of forEach to produce a good functional code.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值