关于lambda表达式访问外部变量有一个非常重要的限制的一点疑惑
lambda表达式访问外部变量有一个非常重要的限制:变量不可变。
请问为什么:
String[] array = {"a", "b", "c"};
for(Integer i : Lists.newArrayList(1,2,3)){
Stream.of(array).map(item -> Strings.padEnd(item, i, '@')).forEach(System.out::println);
}可以执行呢?
而:
String[] array = {"a", "b", "c"};
for(int i = 1; i<4; i++){
Stream.of(array).map(item -> Strings.padEnd(item, i, '@')).forEach(System.out::println);
}就不可以?这两个i都是局部变量,并且不是final呀?
难道说在lambda语句执行过程中不可变就可以了吗?我觉得不太对,我查了一些for each的源代码,是不是因为第一个里的i指向的是迭代器里的next方法返回的对象这是不变的,而根据
public E next() {
checkForComodification();
try {
int i = cursor;
E next = get(i);
lastRet = i;
cursor = i + 1;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
next方法返回的对象是改变的。所以临时变量i是final的。
不知道理解的对不对,希望各位大神可以指点一下,谢谢
请问为什么:
String[] array = {"a", "b", "c"};
for(Integer i : Lists.newArrayList(1,2,3)){
Stream.of(array).map(item -> Strings.padEnd(item, i, '@')).forEach(System.out::println);
}可以执行呢?
而:
String[] array = {"a", "b", "c"};
for(int i = 1; i<4; i++){
Stream.of(array).map(item -> Strings.padEnd(item, i, '@')).forEach(System.out::println);
}就不可以?这两个i都是局部变量,并且不是final呀?
难道说在lambda语句执行过程中不可变就可以了吗?我觉得不太对,我查了一些for each的源代码,是不是因为第一个里的i指向的是迭代器里的next方法返回的对象这是不变的,而根据
public E next() {
checkForComodification();
try {
int i = cursor;
E next = get(i);
lastRet = i;
cursor = i + 1;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
next方法返回的对象是改变的。所以临时变量i是final的。
不知道理解的对不对,希望各位大神可以指点一下,谢谢
...全文
相关推荐
Lambda表达式里面修改外部变量问题
Lambda 表达式里面修改外部变量问题Lambda 表达式是一种匿名函数,可以捕获外部变量,但是它有一个限制:只能捕获 final 或 effectively final 的变量。
C++ 中的 Lambda 表达式
Lambda表达式由几个主要部分组成:1. **Capture子句**:定义Lambda表达式能够访问哪些外部变量。2. **参数列表**:定义Lambda表达式的输入参数。3.
C++11 lambda表达式
- 函数体:`{}`内包含lambda函数执行的实际代码。2. **捕获列表** - 捕获列表决定了lambda函数如何访问其外部作用域的变量。
C++ 中lambda表达式的编译器实现原理
捕获的变量在构造函数中传入,使得Lambda能够访问这些值。在编译过程中,Lambda表达式会被转换为相应的函数对象实例,然后在需要的地方调用其`operator()`。
Java Lambda表达式与匿名内部类的联系和区别实例分析
一、Lambda表达式和匿名内部类的联系Lambda表达式和匿名内部类都是用于实现函数式编程的方式,它们都可以直接访问“effectively final”的局部变量,以及外部类的成员变量(包括实例变量和类变量


