学习任务:

视频学习

什么是方法引用

方法引用测试

Lambda表达式是依据函数式接口来定义,确切的说是依据函数式接口中的抽象方法来定义Lambda,使用Lambda进行函数式编程,Lambda表达式定义的就是函数,在Java中方法就是函数。

Java中的方法可以当作一个引用作为函数使用,它叫方法引用,方法引用是一种将方法应用于函数式编程的方法,方法引用可以代替Lambda。

下边我们将Lambda表达式改为方法引用:

接口如下:

package com.pbteach.javase.oop.lambda.test3;

/**
 * 	函数式接口
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public interface Fun2 {
	//有参数有返回值
	int handler(int a,int b);
}

先用Lambda测试:

package com.pbteach.javase.oop.lambda.test3;

/**
 * Lambda测试
 * 
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public class Fun2Demo {
 
	public static void main(String[] args) {

		//使用Lambda,调用doFun2
		doFun2((int x,int y)->{
			int z = x*y;
			return z;
		});
	}

	public static void doFun2(Fun2 fun2) {
		int r = fun2.handler(2,3);
		System.out.println(r);
	}
}

再用方法引用去代替Lambda,写一个方法只要方法的参数和返回值与函数式接口的抽象方法一致就可以代替上边的Lambda。

下边代码是Utils类,有一个求两个数积的方法:

package com.pbteach.javase.oop.lambda.test3;

/**
 * 	方法引用测试
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public class Utils {
	//求两个数的积
	public static int product(int a,int b) {
		return a*b;
	}
}

此类的product方法与Fun2的int handler(int a,int b);方法匹配,即参数和返回值匹配,所以可以将Utils的product方法当作Lambda去使用,如下:

package com.pbteach.javase.oop.lambda.test3;

/**
 * 方法引用测试
 * 
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public class Fun2Demo2 {
 
	public static void main(String[] args) {

		//使用Lambda,调用doFun2
		doFun2((int x,int y)->{
			int z = x*y;
			return z;
		});
		//使用方法引用,调用doFun2
		doFun2(Utils::product);
	}

	public static void doFun2(Fun2 fun2) {
		int r = fun2.handler(2,3);
		System.out.println(r);
	}
}

通过例子可知 “方法引用” 的语法如下:

Utils::product表示引用了Utils类的product方法,::该符号(两个冒号)为引用运算符,它所在的表达式被称为方法引用。

Utils类的product方法与Fun2接口的handler方法具有输入参数类型和返回值类型一致,完全可以替换Lambda表达式。

通过测试我们知道,一个方法的参数和返回值类型与函数式接口的抽象方法一致就可以用方法代替Lambda。

在实际生产中会大量使用jdk类库中的工具类,以方法引用的方式来使用这些工具类会非常方便,比如:Integer类的sum方法是返回两个数的和,它的输入参数类型与返回值类型与Fun2接口的handler方法一致,所以Integer类的sum方法完全可以替代原有的Lambda表达式,如下代码:

package com.pbteach.javase.oop.lambda.test3;

/**
 * 	方法引用测试
 * 
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public class Fun2Demo3 {
	 
	public static void main(String[] args) {
		//调用doFun2
		//使用lambda表达式
		doFun2((x,y)->Integer.sum(x,y),2,3);
		//使用方法引用
		doFun2(Integer::sum,2,3);
		
	}

	public static void doFun2(Fun2 fun2,int a,int b) {
		int r = fun2.handler(a,b);
		System.out.println(r);
	}
}

Integer::sum表示引用了Integer类的sum方法,doFun2(Integer::sum)将sum方法传递给doFun2的参数,通过函数式接口变量fun2调用sum方法。

提问-攀博课堂
我要提问 不会就问,有效沟通
关注公众号,加入微信群交流提问。 攀博课堂官方公众号
问答列表,查看本知识点所有问题