如何推荐Lambda?

时间:2015-01-04 16:40:07

标签: java java-8 lambda

如果我需要递归使用myLambda,我该如何从内部引用 Lambda

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

3 个答案:

答案 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;