import java.util.function.Supplier; import java.util.function.Function; abstract class Initial { abstract Initial leftMap(Function leftTransform); abstract Initial leftFlatMap(Function> leftTransform); public void testThingy(final Initial left23, final Initial left42, final Initial left57) { final Initial r2 = left23.leftFlatMap(i -> left42.leftFlatMap(j -> left57.leftMap(k -> i + j + k))); } } //simplified abstract class Either { abstract void first(Supplier> leftTransform); abstract Either second(Supplier> leftTransform); abstract Either third(Supplier leftTransform); public void test(A a) { first(() -> second(() -> third(() -> a))); } }