import java.util.ArrayList; import java.util.List; public interface Predicate { boolean test(T t); } interface Function { R apply(T t); } interface Consumer { void accept(T t); } interface Supplier { T get(); } interface BiFunction { R apply(T t, U u); } interface TriFunction { R apply(T t, U u, V v); } public class SuperClass { public SuperClass() { } public SuperClass(String s) { } void print(Integer val) { System.out.println(val); } static void print(Boolean val) { System.out.println(val); } boolean isEqual(Integer i, Integer j) { return i.equals(j); } boolean isEqualAsStrings(Integer i, String j) { return i.toString().equals(j); } int add(Integer i, Integer j) { return i + j; } String getOneNumberAsString(Integer i, Integer j, Integer k) { return i.toString(); } int returnSameValue(Integer i) { return i; } String returnSameValue(String s) { return s; } } public class MethodReferences extends SuperClass { List list = new ArrayList<>(); void print(String s) { System.out.println(s); } boolean isAnyEqualToString5(List list, BiFunction biFunction) { for (Integer integer : list) { if (biFunction.apply(integer, "5")) { return true; } } return false; } Function classMethod() { return Object::hashCode; } Function superclassMethodNotOverridden() { return SuperClass::hashCode; } Function superclassMethodOverridden() { return String::hashCode; } Function superclassMethodWithSubclassType() { return Object::hashCode; } Consumer fieldAccessMethod() { return System.out::println; } Consumer thisClassMethod() { return this::print; } Consumer superclassMethod() { return super::print; } Function instanceMethod() { return list::add; } Supplier zeroArgumentConstructor() { return SuperClass::new; } Function singleArgumentConstructor() { return SuperClass::new; } Consumer staticMethod() { return SuperClass::print; } BiFunction biFunction() { return super::isEqualAsStrings; } TriFunction customTriFunction() { return super::getOneNumberAsString; } void consumerDeclaredInMethod() { Consumer stringConsumer = this::print; } void functionDeclaredInMethod() { Function stringFunction = super::returnSameValue; } void biFunctionDeclaredInMethod() { BiFunction biFunction = super::isEqual; } void consumerUsedInStream() { list.stream().forEach(super::print); } void functionUsedInStream() { list.stream().map(super::returnSameValue); } void biFunctionUsedInStream() { list.stream().reduce(0, super::add); } void biFunctionInMethodCall() { isAnyEqualToString5(list, super::isEqualAsStrings); } }