引用其封闭范围内的元素的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超过必要的可能性之间进行权衡?
我正在使用R中的大型数据表,并且我试图遍历整个表并根据单独列中前一行的值在给定列中设置行值.
我试图在一个有200K行的表上运行这个循环,它的移动速度非常慢.我怀疑我没有利用所有data.table的效率,但不知道我可以改进的地方.
我的代码如下.我的表是"DATA",我的钥匙都柱"X"和"Y",而我通过所有行试图环和6列组行的值设置为1 只,如果该行的第2列中值不等于第2列中前一行的值.
setkey(DATA,x,y)
for (i in 2:nrow(DATA)) {
if (DATA[i,2]!=DATA[i-1,2]){
DATA[i, 6] = 1
}
}
Run Code Online (Sandbox Code Playgroud)
同样,这可行,但对于大型表来说非常慢.任何帮助将不胜感激 - 谢谢!