【发布时间】:2019-10-23 20:55:01
【问题描述】:
- 案例一:使用for-each循环时可以工作:
private void m10(String[] arr) {
for (String s : arr) {
Supplier<String> supplier = () -> {
System.out.println(s);
return null;
};
supplier.get();
}
}
或
private void m10(Object[] arr) {
for (Object s : arr) {
Supplier<String> supplier = () -> {
System.out.println(s);
return null;
};
supplier.get();
}
}
- 案例 2:它会捕获编译时错误
private void m11(String[] arr) {
for (int i = 0; i < arr.length; i++) {
Supplier<String> supplier = () -> {
System.out.println(arr[i]);
return null;
};
supplier.get();
}
}
在情况 2 中,我知道变量 i 不是有效的最终变量,因为它的值在循环迭代之间发生了变化。但我不明白为什么 lambda 可以在案例 1 中工作。
【问题讨论】:
-
了解
s的作用域会有所帮助:How is Java's for loop code generated by the compiler -
因为
for(final String s : arr)也是有效的。这就是有效地最终的意思;添加final关键字不会破坏它。 -
您可以认为案例 1 等同于在案例 2 的循环中执行
String s = arr[i];的第一件事。这也将允许您在 lambda 中执行System.out.println(s);,因为s实际上是最终的. (感谢@Slaw 指出这是重复的;原始问题中有更多信息。)