I am trying to make a lambda function that references itself, and it is used as a callback for an asynchronous process, so I cannot use a loop. If I declare the function like so :
Consumer<String> func = argument -> {
async_fn(func); // Call a function with func as callback
};
the compiler tells me The local variable func may not have been initialized.
If I write it that way instead :
Consumer<String> func = argument -> {}; // pre-declare func
func = argument -> {
async_fn(func); // Call an function with func as callback
};
the compiler says local variables referenced from a lambda expression must be final or effectively final.
How could this be written so that the function references itself ? The function cannot be a class field because it references a method’s locals.
Advertisement
Answer
Although I do not understand why such a construct would be needed, you could do:
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
});
Or use an array.