java8 lambda和方法引用示例
程序员文章站
2022-05-28 20:46:16
...
public class Test { protected interface FunctionEx { void execute(String a); default void defaultMethod() { System.out.println("FunctionEx default executed!"); } } public String saySomething(String a) { System.out.println("say :" + a); // 当前FunctionEx.execute返回void,saySomething有返回值不影响方法引用, // 当FunctionEx.execute有返回值,则saySomething返回值类型必须与之相同, // 否则不能引用 return ""; } public void doTest(String a, FunctionEx functionEx) { System.out.print("doTest "); functionEx.execute(a); } public void doTest2(String a) { doTest(a, this::saySomething); doTest(a, n -> this.saySomething(n)); // 此处this可省略 doTest(a, n -> saySomething(n)); doTest(a, new FunctionEx() { @Override public void execute(String a) { // this.saySomething(a); // 匿名内部类的this指向匿名内部类,所以此处不能用this.saySomething // lambda的this指针指向的是包围lambda表达式的类 saySomething(a); } }); } public static void main(String[] args) { String str = "hello"; Test test = new Test(); test.doTest(str, n -> test.saySomething(n)); test.doTest(str, test::saySomething); // 方法引用的方式可以简化lambda表达式的写法 // 可使用方法引用的前提:lambda的主体仅包含一个表达式,且该表达式仅调用了一个已经存在的方法。 test.doTest(str, n -> { test.saySomething(n); // defaultMethod(); // lambda表达式不能调用接口中的默认方法 }); test.doTest(str, new FunctionEx() { @Override public void execute(String a) { test.saySomething(a); defaultMethod();// 匿名类实现的抽象方法允许调用接口中的默认方法 } }); System.out.println("doTest2 start"); test.doTest2(str); } }