什么是方法引用?
Lambda还有一个非常重要的功能,就是方法引用。方法引用可以理解为lambda表达式的简便写法。方法引用是用来直接访问类或者实例的已经存在的方法或构造方法(函数),它比lambda表达式更加的简洁,更高的可读性,更好的复用性。
方法引用的语法
类名(或实例)::方法名
方法引用的分类
方法引用类型 | 语法 | Lambda表达式 |
---|---|---|
静态方法引用 | 类名::staticMethod | (args)->类名.staticMethod(args) |
实例方法引用 | instance::instMethod | (args)->instance::instMethod(args) |
对象方法引用 | 类名::instMethod | (instance,args)->类名::instMethod(args) |
<u>构造方法引用</u> | <u>类名::new</u> | <u>(args)->new 类名(args)</u> |
构造方法引用的定义
函数式接口的实现可以通过调用一个类的构造方法来实现,就可以称之为构造方法引用。
构造方法引用的示例
废话少说,直接上干货,代码示例中都有重要注释
无输入参数,无返回值
构造方法引用,调用无参构造方法,由于实例对象无需返回,这个测试实际上没什么意义。
public class LambdaConstructorTest {
/**
* 无参数,无返回值
*/
@Test
public void test() {
/**
* Runnable函数式接口,无参无返回值,
* 但是new Student() 仅仅创建一个对象,不作return处理
*/
Runnable r1 = () -> new Student();
// r1可以改写为构造方法引用,调用无参构造方法
Runnable r2 = Student::new;
r1.run();
r2.run();
}
}
class Student {
private String name;
private Integer age;
public Student() {
System.out.println("student defualt constructor");
}
public Student(String name) {
System.out.println("student constructor param name:" + name);
this.name = name;
}
public Student(String name, Integer age) {
System.out.println("student constructor param name:" + name + ", age:" + age);
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
有参数,无返回值
构造方法引用,调用无参构造方法
Supplier<Student> s2 = Student::new;
public class LambdaConstructorTest {
/**
* 测试无参有返回值场景
*/
@Test
public void testNoArgReturnValue(){
/**
* java.util.function.Supplier java8自带的函数式接口
* 返回一个student类对象
*/
Supplier<Student> s1 = ()->new Student();
// 将s1改写为构造方法引用,调用无参构造方法
Supplier<Student> s2 = Student::new;
//获取返回对象
s1.get();
s2.get();
}
}
class Student {
private String name;
private Integer age;
public Student() {
System.out.println("student defualt constructor");
}
public Student(String name) {
System.out.println("student constructor param name:" + name);
this.name = name;
}
public Student(String name, Integer age) {
System.out.println("student constructor param name:" + name + ", age:" + age);
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
有一个参数,有返回值
构造方法引用,调用带一个参数String name的构造方法
Function<String, Student> f2 = Student::new;
public class LambdaConstructorTest {
/**
* 测试有一个参数,有返回值
*/
@Test
public void testArgsReturnValue(){
/**
* java.util.function.Function java8自带的函数式接口
*
* 返回值调用带有一个参数name的构造方法
*/
Function<String, Student> f1 = name->new Student(name);
// 将f1改为构造方法引用,调用带一个参数String name的构造方法
Function<String, Student> f2 = Student::new;
f1.apply("zhang san");
f2.apply("li si");
}
}
class Student {
private String name;
private Integer age;
public Student() {
System.out.println("student defualt constructor");
}
public Student(String name) {
System.out.println("student constructor param name:" + name);
this.name = name;
}
public Student(String name, Integer age) {
System.out.println("student constructor param name:" + name + ", age:" + age);
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
若是有2个或更多参数的构造方法又如何实现构造方法引用呢?这个作业留给大家练习。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。