什么是办法援用?
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> |
构造方法援用的定义
函数式接口的实现能够通过调用一个类的构造方法来实现,就能够称之为构造方法援用。
构造方法援用的示例
废话少说,间接上干货,代码示例中都有重要正文
无输出参数,无返回值
构造方法援用,调用无参构造方法,因为实例对象无需返回,这个测试实际上没什么意义。
<code class="java">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;
<code class="java">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 nam<i style="color:transparent">来源gaodai$ma#com搞$$代**码网</i>e:" + 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;
<code class="java">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个或更多参数的构造方法又如何实现构造方法援用呢?这个作业留给大家练习。