class="java">
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);
}
}