14.1.5 方法引用

lambda表达式提供了一种简洁的方式来创建函数式接口的实现对象。Java类中的已有方法也可以被当成lambda表达式来使用,只需要直接引用已有的方法即可。方法引用相当于复用了Java类中已有方法的方法体。方法引用的使用条件与lambda表达式是相同的。代码清单14-7给出了方法引用的示例。在调用Arrays类的静态方法sort时,第二个参数是Comparator接口的实现对象。代码清单14-7中使用了已有类Comparators中的静态方法compareString作为Comparator接口的实现对象的内部实现逻辑。

代码清单14-7 方法引用的使用示例


//已有方法的声明

public class Comparators{

public static int compareString(String s1,String s2){

return s1.compareToIgnoreCase(s2);

}

}

//方法引用的使用

String[]array=new String[]{"c","b","a"};

Arrays.sort(array, Comparators:compareString);

System.out.println(Arrays.deepToString(array));


在使用方法引用时,除了可以引用静态类中的方法外,还可以引用特定对象中的实例方法、特定类型的任意对象中的实例方法及构造方法。在引用对象的实例方法时,使用对象的引用作为方法引用时的前缀,如类似“myObj:myMethod”的形式。如果引用的是任意对象中的实例方法,那么在引用时,使用方法所在的类型名称作为前缀,如类似“MyClass:myMethod”的形式。在方法被调用时,实际的调用接收者对象会作为方法的第一个参数。例如,代码清单14-7中的字符串比较的逻辑可以简化成“Arrays.sort(array, String:compareToIgnoreCase);”。在String类的compareToIgnoreCase方法被实际调用时,当前的String类的对象会作为compareToIgnoreCase方法的第一个参数。引用构造方法的形式类似于引用类中的静态方法,只不过方法的名称固定为“new”。例如,“MyClass:new”用来引用类MyClass中的构造方法。如果一个类中定义了多个构造方法,那么方法引用被使用时的目标类型用于选择适用的构造方法。