// 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 { private F f; public static Function function(final BiFunction, R> f) { final Recursive> r = new Recursive<>(); return r.f = t -> f.apply(t, r.f); } public static IntUnaryOperator intUnaryOperator(final BiFunction f) { final Recursive r = new Recursive<>(); return r.f = i -> f.apply(i, r.f); } public static IntFunction intFunction(final BiFunction, R> f) { final Recursive> r = new Recursive<>(); return r.f = i -> f.apply(i, r.f); } // TODO : One static method for each interface in java.util.function }