Java8实战的讲解如下:
Lamada对局部变量的限制
你可能会问自己,为什么局部变量有这些限制。第一,实例变量和局部变量背后的实现有一个关键不同。实例变量都存储在堆中,而局部变量则保存在栈上。如果Lambda可以直接访问局部变量,而且Lambda是在一个线程中使用的,则使用Lambda的线程,可能会在分配该变量的线程将这个变量收回之后,去访问该变量。因此,Java在访问自由局部变量时,实际上是在访问它的副本,而不是访问原始变量。如果局部变量仅仅赋值一次那就没有什么区别了——因此就有了这个限制。第二,这一限制不鼓励你使用改变外部变量的典型命令式编程模式(我们会在以后的各章中解释,这种模式会阻碍很容易做到的并行处理)。
读了上文依然不太理解。个人感觉,除非有危害,否则没必要限制。自己思索的结果如下:
如果不加,会产生极大的不一致。
Object A
// ******Object C = A;
Lamada A
Object B
B = A
// ******B = C
你希望 B是 Lamada表达式处理过的A,
实际上可能不是,也可能是(玄学数据)。
如果不希望,就引入C吧