Noe*_*oel 13 java lambda functional-programming java-8
引用其封闭范围内的元素的Java lambda包含对其封闭对象的引用.一个人为的例子,lambda持有ref给MyClass:
class MyClass {
final String foo = "foo";
public Consumer<String> getFn() {
return bar -> System.out.println(bar + foo);
}
}
Run Code Online (Sandbox Code Playgroud)
如果lambda的寿命很长,这是有问题的; 然后我们得到一个长寿的MyClass引用,否则它会超出范围.在这里我们可以通过用私有静态类替换lambda来优化,这样我们只需要对我们需要的String进行引用,而不是对整个类:
class MyClass {
private static class PrintConsumer implements Consumer<String> {
String foo;
PrintConsumer(String foo) {
this.foo = foo;
}
@Override
public void accept(String bar) {
System.out.println(bar + foo);
}
}
final String foo = "foo";
public Consumer<String> getFn() {
return new PrintConsumer(foo);
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这是超级冗长的,并且破坏了我们从lambdas中封闭范围中使用(有效最终)变量获得的良好语法.这在技术上是最佳的吗?是否总是在良好的语法和保持ref超过必要的可能性之间进行权衡?
Luk*_*der 15
class MyClass {
final String foo = "foo";
private Consumer<String> getFn() {
String localFoo = foo;
return bar -> System.out.println(bar + localFoo);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,lambda只捕获局部变量getFn().MyClass.this不再被捕获.
class MyClass {
final String foo = "foo";
private Consumer<String> getFn() {
return getFn(foo);
}
private static Consumer<String> getFn(String localFoo) {
return bar -> System.out.println(bar + localFoo);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
456 次 |
| 最近记录: |