方法引用(2)
通过super引用父类
如果存在继承关系,当Lambda中需要出现super调用时,也可以使用方法引用进行替代。首先是函数式接口:
/** * 定义见面的函数式接口 */ @FunctionalInterface public interface Greeable { // 定义一个见面的方法 void greet(); }
然后是父类Human的内容:
/** * 定义父类 */ public class Human { // 定义一个sayHello的方法 public void sayHello(){ System.out.println("Hello,我是Human"); } }
最后是子类Man的内容,其中使用了Lambda的写法∶
/** * 定义一个子类 */ public class Man extends Human{ // 子类重写父类sayHello的方法 @Override public void sayHello(){ System.out.println("Hello,我是Man"); } // 定义一个方法参数传递Greeable接口 public void method(Greeable g){ g.greet(); } public void show(){ /*// 调用method方法,方法的参数Greeable是一个函数式接口,所以可以传递Lambda method(() -> { // 创建父类Human对象 Human h = new Human(); // 调用父类的sayHello方法 h.sayHello(); }); // 因为有子父类关系,所以存在的一个关键字super,代表父类,所以我们可以直接使用super调用父类的成员方法 method(() -> { super.sayHello(); });*/ /** * 使用super引用类的成员方法 * super是已经存在的 * 父类的成员方法sayHelLo也是已经存在的 * 所以我们可以直接使用super引用父类的成员方法 */ method(super :: sayHello); } public static void main(String[] args) { new Man().show(); } }
通过this引用成员方法
this代表当前对象,如果需要引用的方法就是当前类中的成员方法,那么可以使用"this:成员方法"的格式来使用方法引用。首先是简单的函数式接口︰
/** * 定义一个富有的函数式接口 */ @FunctionalInterface public interface Richable { // 定义一个方法 public void buy(); }
通过this引用本类的成员方法:
/** * 通过this引用本类的成员方法 */ public class Husband { // 定义一个buyHouse的方法 public void buyHouse(){ System.out.println("北京 时代峻峰!"); } // 定义一个marry的方法,参数传递Richable接口 public void marry(Richable r){ r.buy(); } // 定义一个soHappy的方法 public void soHappy(){ /* 使用方法引用优化Lambda表达式 this是已经存在的 本类的成员方法buyHouse也是已经存在的 所以我们可以直接使用this引用本类的成员方法buyHouse */ marry(this :: buyHouse); } public static void main(String[] args) { new Husband().soHappy(); } }