我在主方法中执行以下内容:
int secrete = 42;
for (int i = 0; i < 5; i++) {
Consumer<String> myprinter2 =
msg -> {
System.out.println("consuming " + msg + " ," + secrete);
};
myprinter2.accept(myprinter2.toString());
}
以上代码的输出为:consuming Main$$Lambda$1/1324119927@6d311334 ,42
consuming Main$$Lambda$1/1324119927@682a0b20 ,42
consuming Main$$Lambda$1/1324119927@3d075dc0 ,42
consuming Main$$Lambda$1/1324119927@214c265e ,42
consuming Main$$Lambda$1/1324119927@448139f0 ,42
如果我将 secrete
改为 final,那么输出结果将是:
consuming Main$$Lambda$1/2003749087@41629346 ,42
consuming Main$$Lambda$1/2003749087@41629346 ,42
consuming Main$$Lambda$1/2003749087@41629346 ,42
consuming Main$$Lambda$1/2003749087@41629346 ,42
consuming Main$$Lambda$1/2003749087@41629346 ,42
secrete
即使我没有声明为final,它也是有效的final变量,那么为什么当我没有将其声明为final时,每个lambda表达式都被认为是一个新的对象?
final int secrete
移到for
循环中,你也会得到第二个输出。 - QBrutefinal
行为,就要明确标记它。 - Basil Bourque