为什么使用lambda遍历for循环报错?

示例:

java
复制代码
public static void main(String[] args) { // 创建一个List集合 List<Integer> list = new ArrayList<>(); // 定义一个外界变量 int a = 1; // 1.使用lambda表达式遍历集合 list.forEach(item -> { item = item + a; // 为什么这种方式不行 }); // 2.增强for循环遍历集合 for (Integer i : list) { i = i + a; } // 3.根据下标循环遍历集合 for (int i = 0; i < list.size(); i++) { i = i + a; } a++; }

为什么同样是for循环,为什么lambda表达式不行呢,那就是lambda有跟别的两种for循环有不一样的概念或者规定。

在使用函数式编程的时候,函数对象和外界变量绑定在一块(就是在函数里面使用外界变量),形成的整体就是闭包,闭包有个限制,外界参数在传入函数对象的时候就不能变化了(1.用final修饰2.外界参数在传入之后不做改变,在示例中a++;注释掉)在案例中使用lambda就形成了闭包。

如何解决

java
复制代码
public static void main(String[] args) { // 创建一个List集合 List<Integer> list = new ArrayList<>(); // 定义一个外界变量 int a = 1; // 定义一个不可变的闭包变量,此处用不用final 修饰都行 只要保证闭包变量不被修改即可 int finalA = a; // 1.使用lambda表达式遍历集合 list.forEach(item -> { item = item + finalA; }); a++; }
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP