在关于lambda和匿名类之间差异的一个论点中,在这篇文章中:
我读了一个声称"Lambdas可以拥有状态",就像匿名类实例一样.
据我所知,你不能添加专属于lambda的用户定义状态,因为没有办法在java lambda函数的实现上定义实例成员.
例如:
Runnable r= () -> { int x = 5; }; // defines a local - no way to define instance
Runnable r2 = new Runnable() {
int x; // defines state via instance member
@Override
public void run() {
// TODO Auto-generated method stub
}
};
Run Code Online (Sandbox Code Playgroud)
只是为了澄清,我并不是想将状态引入lambda,因为我认为这违背了意图.我只是想验证或反驳上述堆栈溢出问题上由信誉良好的来源做出的技术性声明.
尽管lambda函数没有像实例变量那样的东西,但它可以更新某些状态.根据你如何看待它,可以说lambda函数有自己的状态.
例如
Supplier<Integer> makeCountingLambda() {
final int[] counter = new int[1];
return (() -> ++counter[0]);
}
Supplier<Integer> f = makeCountingLambda();
f.get(); // 1
f.get(); // 2
Run Code Online (Sandbox Code Playgroud)
f是一个lambda函数.每次get()调用它都会提供一个新值,因为它的状态会更新.
像这样的东西似乎是引用的评论所描述的内容.