快速学习Java8新特性第四讲——方法引用与构造器引用

为何要使用方法引用与构造器引用?

如果不使用Lambda表达式进行程序编写的话,那么大可不必关注方法引用和构造器引用,但是如果使用Lambda表达式,再配合方法引用和构造器引用之后,那么可以使Lambda编写匿名内部类的代码变得更加简洁。在不影响性能的前提下简洁的代码可以增强代码的可读性(当然是在阅读者知晓对方语法的前提下)。

方法引用

方法引用是什么?

当要传递给Lambda体的操作,已经有实现的方法了,那么这时便可以使用方法引用了。也可以理解为方法引用是Lambda表达式的另外一种表现形式。不过有一点需要我们注意:Lambda体中调用方法的参数列表与返回值类型,要与函数式接口中抽象方法的参数列表与返回值类型保持一致!

方法引用的语法格式

方法引用使用操作符::将方法名和对象或类的名字分隔开来。方法引用主要有三种语法格式,它们分别是:
在这里插入图片描述
下面我会分别一一介绍这三种语法格式。

第一种语法格式:对象::实例方法名

观察如下的Java程序,你会看到在Lambda体中有一个println()方法已经完成了我们要操作的功能(即完成了在Lambda体中所写的功能),那么,在这种情况下我们就可以使用方法引用了!
在这里插入图片描述
在使用方法引用时,有一个前提:你需要实现的接口(例如Consumer<T>)中的抽象方法的参数列表与返回值类型要与我们当前调用的方法的参数列表与返回值类型保持一致!这点一定要引起我们的注意。
再来看另外一个案例,使用Lambda表达式来实现供给型接口时,发现在Lambda体中已经有实现的方法了,这时我们也可以使用方法引用。
在这里插入图片描述
其中,Employee实体类的内容如下:

package com.meimeixia.java8;

public class Employee {

	private int id;
	private String name;
	private int age;
	private double salary;

	public Employee() {

	}

	public Employee(int id, String name, int age, double salary) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.salary = salary;
	}
	
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public double getSalary() {
		return salary;
	}

	public void setSalary(double salary) {
		this.salary = salary;
	}

	@Override
	public String toString() {
		return "Employee [id=" + id + ", name=" + name + ", age=" + age + ", salary=" + salary + "]";
	}

}

第二种语法格式:类::静态方法名

使用方法引用的这种格式,可以引用类的静态方法。
在这里插入图片描述
你可以查看一下Integer.compare()方法的参数列表与返回值类型和Comparator接口中compare()方法的参数列表与返回值类型是不是一致的?显然是一致的。

第三种语法格式:类::实例方法名

使用方法引用的这种格式得有一个前提,也可以说是规则,即若Lambda表达式参数列表中的第一个参数是你这个方法(实例方法)的调用者,而第二个参数是你要调用方法(实例方法)的参数时,则可使用ClassName::method这种格式。
在这里插入图片描述

构造器引用

构造器引用的语法格式是ClassName::new。它与函数式接口相结合,自动与函数式接口中方法兼容,可以把构造器引用赋值给定义的方法,但构造器的参数列表要与接口中抽象方法的参数列表保持一致!
为了演示构造器引用,我们可以在Employee实体类中多写几个构造方法,如下图所示。
在这里插入图片描述
然后,使用一下构造器引用的方式。
在这里插入图片描述
不知你有没有想过,Employee实体类中有好几个构造器,那么现在调用的是哪个构造器呢?道理跟方法引用一样,由于构造器的参数列表要与接口中抽象方法的参数列表保持一致,所以此时调用的是无参的构造器。
现在,我要调用Employee实体类中一个参数的构造器,那该怎么办呢?
在这里插入图片描述

数组引用

数组引用的语法格式是Type[]::new。下面我就通过一个案例简单使用一下数组引用。
在这里插入图片描述
至此,Java 8中有关Lambda表达式的所有内容我就算是总结完了!接下来开始学习Java 8中另外一个最核心的新特性,即Stream API。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李阿昀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值