// Usage:
import static com.example.foo.Recursive.*;
// ...
final IntUnaryOperator fib = intUnaryOperator((i, self) -> i <= 1 ? i : self.applyAsInt(i - 1) + self.applyAsInt(i - 2));
for (int n = 0; n <= 10; n++) System.out.format("F%d = %d", n, fib.applyAsInt(n));
-------------------------------------------
package com.example.foo;
import java.util.function.*;
public class Recursive<F> {
private F f;
public static <T, R> Function<T, R> function(final BiFunction<T, Function<T, R>, R> f) {
final Recursive<Function<T, R>> r = new Recursive<>();
return r.f = t -> f.apply(t, r.f);
}
public static IntUnaryOperator intUnaryOperator(final BiFunction<Integer, IntUnaryOperator, Integer> f) {
final Recursive<IntUnaryOperator> r = new Recursive<>();
return r.f = i -> f.apply(i, r.f);
}
public static <R> IntFunction<R> intFunction(final BiFunction<Integer, IntFunction<R>, R> f) {
final Recursive<IntFunction<R>> r = new Recursive<>();
return r.f = i -> f.apply(i, r.f);
}
// TODO : One static method for each interface in java.util.function
}
Comments