第一次经历了一个闭包例子,但是我很难把我的头绕在控制流上。
public class TestLambdaClosure {
public static void main(String[] args) {
int a= 10;
int b=20;
//doProcess(a, i-> System.out.println(i+b));
doProcess(a, new Process() {
@Override
public void process(int i) {
System.out.println(i+b);
}
});
}
public static void doProcess(int i, Process p) {
p.process(i);
}
interface Process{
void process(int i);
}
}当调用p.process(i)时,b是如何进入作用域的?此外,控制流在这里内部是如何工作的?
发布于 2019-03-03 06:30:39
闭包允许您通过将(代码和上下文)封装到单个构造中来建模行为。
关键的概念是,您的函数代码(lambda)不仅可以引用它自己的变量,还可以引用代码之外的所有可见变量,在您的情况下,变量a和b。
在Java中,闭包只能引用最终或有效的最终变量。这意味着,变量的引用不能更改,闭包只看到实际的不可变状态(值实际上不是不可变的,最终意味着变量不能重新分配)。在理论上,这是不必要的。例如,在JavaScript中,可以编写这样的代码:
function newCounter() {
let count = 0;
return function() { return ++count; };
}
const nc = newCounter();
console.log(nc()); // 1
console.log(nc()); // 2
console.log(nc()); // 3在这里,newCounter的高级内部函数仍然可以访问更高级的count(其上下文),并且可以修改它(变量是可变的)。
注意,在闭包之外,代码的任何其他部分都无法访问变量counter。
https://stackoverflow.com/questions/54964992
复制相似问题