来自Wikipedia:
蹦床是一个循环调用 thunk-returning
功能
在自己对蹦床进行一些研究时,我偶然发现了上面的那条线。因此,我对thunk 在 Java 中的工作方式和外观进行了一些试验。我得到了值得分享的令人满意的结果。这是对先前答案的相当大的升级,因为 thunk 看起来与递归函数非常相似。这是由于自 java 8 以来添加的functional interfaces。
// Recursive
private int factorial(final int number) {
return (number == 1)
? 1
: number * factorial(number -1);
}
将执行阶乘(上)的递归方式与下面的 thunk 返回版本进行比较。注意到相似之处了吗?
// The thunk returning version
private Pair<Supplier, Long> factorial(long number, long sum){
return (number == 1)
? new Pair<>(null, sum)
: new Pair<>(() -> factorial(number -1, sum * number), null);
}
我在这里使用了Java的Pair,你可以认为它是一个穷人的Tupel。在您自己的项目中,您可以在 Supplier 函数上使用多态性,如果您愿意的话。两者都应该工作。
为了调用 thunk 返回版本,我使用下面的 while 循环。
private long trampoline(long number) {
Pair<Supplier, Long> supplierOrResult = new Pair<>(()-> factorial(number, 1), null);
while (supplierOrResult.getValue() == null) {
supplierOrResult = (Pair<Supplier, Long>)supplierOrResult.getKey().get();
}
return supplierOrResult.getValue();
}
当您回顾维基百科的引用时,您会发现这里的 while 循环就是蹦床。我们有一个while loop,它调用一个function,它返回一个thunk!