package test; import kotlin.jvm.functions.Function0; import kotlin.jvm.functions.Function1; import java.util.Collections; import java.util.List; class Test { public static Java8Class field = new Java8Class(); public static Java8Class staticFun() { return new Java8Class(); } public int memberFun() {return 1;} public static String testOverloads() { return "1"; } public static String testOverloads(int i) { return "2"; } } class Java8Class { private Java8Class field = new Java8Class(); public void testStaticFunction() { Function0 staticFunFromSameClass = Java8Class::staticFun; staticFunFromSameClass.invoke(); Function0 staticFunFromAnotherClass = Test::staticFun; staticFunFromAnotherClass.invoke(); } public void testMemberFunctionThroughClass() { Function1<Java8Class, Integer> memberFunFromClass = Java8Class::memberFun; memberFunFromClass.invoke(new Java8Class()); } public void testMemberFunctionThroughObject() { Java8Class obj = new Java8Class(); Function0 memberFunFromSameClass = obj::memberFun; memberFunFromSameClass.invoke(); Test anotherObj = new Test(); Function0 memFunFromAnotherClass = anotherObj::memberFun; memFunFromAnotherClass.invoke(); Function0 memberFunThroughObj1 = field::memberFun; memberFunThroughObj1.invoke(); Function0 memberFunThroughObj2 = Test.field::memberFun; memberFunThroughObj2.invoke(); Function0 memberFunThroughObj3 = Test.staticFun()::memberFun; memberFunThroughObj3.invoke(); } public void testConstructor() { Function0 constructorSameClass = Java8Class::new; constructorSameClass.invoke(); Function0 qualifiedConstructorSameClass = test.Java8Class::new; qualifiedConstructorSameClass.invoke(); Function0 constructorAnotherClass = Test::new; constructorAnotherClass.invoke(); Function0 qualifiedConstructorAnotherClass = test.Test::new; qualifiedConstructorAnotherClass.invoke(); } public void testLibraryFunctions() { Function1<String, Integer> memberFunFromClass = String::length; memberFunFromClass.invoke("str"); } public void testOverloads() { Function0<String> constructorWithoutParams = Test::testOverloads; constructorWithoutParams.invoke(); Function1<Integer, String> constructorWithParam = Test::testOverloads; constructorWithParam.invoke(2); } public void testGenericFunctions() { Function0<List<String>> emptyList = Collections::emptyList; emptyList.invoke(); } public static int staticFun() { return 1; } public int memberFun() { return 1; } public Java8Class() {} }