如果我需要递归使用myLambda
,我该如何从内部引用 Lambda ?
myLambda -> {expression}
// ^^^^^^^^^^ how can I refer to myLambda here?
答案 0 :(得分:7)
如果你的意思是想要引用lambda表达式,你在中定义那个lambda表达式,我不相信有任何这样的机制。我知道一些很少的案例,它们会很有用 - 基本上是递归定义 - 但我不相信它是受支持的。
您无法在Java中捕获非最终变量这一事实使得这一点变得更加困难。例如:
// This doesn't compile because fib might not be initialized
Function<Integer, Integer> fib = n ->
n == 0 ? 0
: n == 1 ? 1
: fib.apply(n - 1) + fib.apply(n - 2);
和
// This doesn't compile because fib is non-final
Function<Integer, Integer> fib = null;
fib = n ->
n == 0 ? 0
: n == 1 ? 1
: fib.apply(n - 1) + fib.apply(n - 2);
Y-combinator会对此有所帮助,但我现在没有精力在Java中提出一个例子:(
答案 1 :(得分:4)
我误解了你的问题。以下是递归调用lambda表达式的方法:
import java.util.function.*;
public class Test
{
static Function<Integer, Integer> fib = null;
public static void main (String[] args)
{
fib = n ->
n == 0 ? 0
: n == 1 ? 1
: fib.apply(n - 1) + fib.apply(n - 2);
System.out.println(fib.apply(8));
}
}
这会产生输出21。
我借用了Jon Skeet的例子并进行了必要的修改以使其发挥作用。
您可以找到另一个递归lambda表达式here的示例。
答案 2 :(得分:1)
如果要定义递归函数,请使用Java的规范方法实现递归函数:方法:
public static int fib(int n) {
return n==0? 0: n==1? 1: fib(n-1)+fib(n-2);
}
然后,如果您需要一个实现功能 interface
的实例,您可以使用方法参考:
Function<Integer, Integer> fib = MyClass::fib;
或
IntUnaryOperator fib0=MyClass::fib;