import java.util.function.Supplier; public interface Lazy extends Supplier { static Lazy of(Supplier sup) { return new LazyImpl(sup); } static Lazy ofSafe(Supplier sup) { return new LazyThreadSafe(sup); } class LazyImpl implements Lazy { private Supplier sup; LazyImpl(Supplier sup) { this.sup = () -> { T val = sup.get(); this.sup = () -> val; return val; }; } @Override public T get() { return sup.get(); } } class LazyThreadSafe implements Lazy { private Supplier outerSup; LazyThreadSafe(Supplier sup) { this.outerSup = new UnEvaled(sup); } class UnEvaled implements Supplier{ Supplier innerSup; UnEvaled(Supplier sup) { innerSup = sup; } public synchronized T get() { if (innerSup == null) { return outerSup.get(); } else { T val = this.innerSup.get(); innerSup = null; outerSup = () -> val; return val; } } } @Override public T get() { return outerSup.get(); } } }