public class MemoFunction implements Function { public final Map cache = new ConcurrentHashMap<>(); private final Function function; public MemoFunction(Function function) { this.function = function; } public Function cache() { return input -> cache.computeIfAbsent(input, function::apply); } @Override public U apply(T t) { return function.apply(t); } }