如何制作一个自引用lambda函数,同时在Java中引用本地函数



我正在尝试创建一个引用自身的lambda函数,它被用作异步进程的回调,所以我不能使用循环。如果我这样声明函数:

Consumer<String> func = argument -> {
async_fn(func); // Call a function with func as callback
};

编译器告诉我The local variable func may not have been initialized.如果我改为这样写:

Consumer<String> func = argument -> {}; // pre-declare func
func = argument -> {
async_fn(func); // Call an function with func as callback
};

编译器说CCD_ 2。这怎么可能被写成函数引用自己呢?函数不能是类字段,因为它引用了方法的局部变量。

虽然我不明白为什么需要这样的构造,但您可以这样做:

Consumer<String> func = argument -> {}; // pre-declare func
List<Consumer<String>> one = new ArrayList<>(Collections.singletonList(func));
one.set(0, argument -> {
async_fn(one.get(0)); // Call an function with func as callback
});

或者使用数组。

它闻起来像代码的味道,但有一些方法可以实现您想要的。

第一个-您可以创建一个调用自身的普通方法,并从传递本地上下文中变量的lambda中调用它。这可能是最干净的方式。

另一种选择是使用局部数组变量,因为即使数组本身(实际上(是最终的,数组的内容也可以修改:

Consumer<String>[] func = (Consumer<String>[]) new Consumer<?>[1];
func[0] = argument -> {
async_fn(func[0]); // Call an function with func as callback
};

或者,您可以将对lambda的引用存储在对象的一个字段中:

private Consumer<String> func;
public void mymethod() {
func = argument -> {
async_fn(func); // Call an function with func as callback
};
}

请考虑不使用lambda,而是使用匿名类。

Consumer<String> func = new Consumer<String>() {
@Override public void accept(String str) {
asyncFn(this, str);
}
};

以后无需将对象添加到另一个可变变量中;匿名内部类可以只使用CCD_ 3。

最新更新