如何引用 Lambda?

How to refer a Lambda?

我如何从其中引用 Lambda,例如,如果我需要递归使用 myLambda

myLambda -> {expression}
//           ^^^^^^^^^^ how can I refer to myLambda here?

我误解了你的问题。以下是递归调用 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

如果您的意思是您想要在 那个 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 中举出一个例子:(

如果要定义递归函数,使用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;