package nise; import java.util.function.BiFunction; import java.util.function.Predicate; import java.util.function.Supplier; class TypeTest { public static void main(String[] args) { assertThat(id(new Combiner<>(echo("A"), echo("B"), (str1, str2) -> new StringBuilder(str1.length() + str2.length()) .append(str1) .append(str2))).get(), hasSameContentAs("AB")); } private static Supplier id(Supplier s) { return s; } private static Supplier echo(T s) { return () -> s; } private static Predicate hasSameContentAs(CharSequence seq) { return charSequence -> charSequence.toString().equals(seq.toString()); } private static void assertThat(T actual, Predicate matcher) { if (!matcher.test(actual)) throw new AssertionError(); } private static class Combiner implements Supplier { private final Supplier s1; private final Supplier s2; private final BiFunction f; public Combiner(Supplier s1, Supplier s2, BiFunction f) { this.s1 = s1; this.s2 = s2; this.f = f; } @Override public R get() { return f.apply(s1.get(), s2.get()); } } }