Java---方法引用

前言

方法引用可以被看作仅仅调用特定方法的Lambda的一种快捷写法。它的基本思想是,如果一个Lambda代表的只是"直接调用这个方法",那最好还是用名称来调用它,而不是去描述如何调用它。针对仅仅涉及单一方法的Lambda的语法糖。

如果你想使用一个方法引用,首先你只能为函数式接口进行方法引用,其次,你要清楚的知道该函数式接口的唯一抽象方法的入参以及出参的个数,接着,你就可以使用入参和出参 个数与抽象方法匹配的方法体进行方法引用,这是最基本的,进行到这一步,有些情况下你可能需要考虑抽象方法体和引用方法体的入参出参类型,以及位置。


方法引用的4种方式


一、指向静态方法的方法引用

例如Integer的parseInt方法,写作

	Integer::parseInt

二、指向构造函数方法引用

对于一个现有构造函数,你可以利用它的名称和关键字new来创建它的一个引用:ClassName::new。它的功能与指向静态方法的引用类似。例如,假设有一个构造函数没有参数。

它适合Supplier的签名() -> Apple。

如果你的构造函数的签名是Apple(Integer weight),那么它就适合Function接口的签名,你可以如下方式编写,同样构造方法的参数个数,类型都可以延伸:

	Function<Integer, Apple> c2 = (Integer weight) -> new Apple(weight);
	Apple a2 = c2.apply(110);

等价于:

	Function<Integer, Apple> c2 = Apple::new;
	Apple a2 = c2.apply(110);

需要一个 Integer 参数(由第一个参数提供),返回值类型(由第二个参数指定)


三、指向现有对象的实例方法的方法引用

假设你有一个局部变量 exp,它支持实例方法 getValue,那么你就可以写作:exp::getValue

该种方法引用指的是,你在Lambda中调用一个已经存在的外部对象中的方法。如,()-> exp.getValue()可以写作:exp::getValue。


四、指向任意类型实例方法 的方法引用

最常用也是复杂的一种方法引用,

该方法引用的思想就是你在引用一个对象的方法,而这个对象本身是Lambda的一个参数。

示例:

	public interface MyCompare<R, K, T> {
		R compareTo(T t, K k); // 注意此处K泛型 与 T泛型对换位置
	}
	
	public class Dish {
		public boolean getM(Integer i, String s){	
			return true;	
		}
	}
	
	public class DishC {
		public static boolean getM(Integer i, String s){	
			return true;	
		}
	}
	
	Dish dish =new Dish();

让我们看考虑下以下使用场景及方式:


	MyCompare<Boolean, String, Integer> myCompare = dish::getM; //编译通过

编译通过。


	MyCompare<Boolean, Integer, String> myCompare = dish::getM;//编译失败

编译失败,引用的方法体的参数的类型位置需要与接口抽象方法的泛型位置对应。


	MyCompare<Boolean, String, Dish> myCompare = Dish::getM; //编译通过

编译通过,此时,抽象方法的最后一个泛型参数用来当做表达式语句的实例对象。


	MyCompare<Boolean, String, Integer> myCompare = DishC::getM; //编译通过

编译通过,静态方法体,不需要使用抽象方法的泛型参数来做实例对象。


解释:

只要引用的方法体入参,出参总和能与函数式表达式的 抽象方法 一致,就可以使用方法引用。当然,引用的方法体的参数的类型位置需要与接口抽象方法的泛型位置对应

类的静态方法需要完全匹配接口格式才能使用方法引用。注意,因为此时的静态方法的方法引用并不需要消耗Lambda表达式的某个参数,作为对象来调用方法引用的方法。

使用方法引用来为某个接口匹配方法体,且匹配的方法体为某个对象调用(也就是非静态方法,需要实例调用),此时可以使用被匹配接口中的某个入参作为该对象。

猜你喜欢

转载自blog.csdn.net/weixin_41087220/article/details/105580973