如何引用 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;
我如何从其中引用 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;