什么是办法援用?
Lambda 还有一个十分重要的性能,就是办法援用。办法援用能够了解为 lambda 表达式的简便写法。办法援用是用来间接拜访类或者实例的曾经存在的办法或构造方法(函数),它比 lambda 表达式更加的简洁,更高的可读性,更好的复用性。
办法援用的语法
类名(或实例):: 办法名
办法援用的分类
办法援用类型 | 语法 | Lambda 表达式 |
---|---|---|
静态方法援用 | 类名::staticMethod | (args)-> 类名.staticMethod(args) |
实例办法援用 | instance::instMethod | (args)->instance::instMethod(args) |
<u> 对象办法援用 </u> | <u> 类名::instMethod</u> | <u>(instance,args)-> 类名::instMethod(args)</u> |
构造方法援用 | 类名::new | (args)->new 类名 (args) |
对象办法援用的定义
1. 形象办法的第一个参数类型刚好是实例办法的对象类型;
2. 形象办法残余的参数恰好能够当做实例办法的参数。
如果函数式接口的实现能满足以上的 2 个条件,就能够称之为对象办法援用。
对象办法援用的示例
废话少说,间接上干货,代码示例中都有重要正文
无输出参数,无返回值
1. 第一个参数 g 类型为 Girl, 没有其它参数,阐明要调用无参办法
2. 同时 g 作为 body 体调用 run 办法的对象,run 办法刚好没有参数
public class LambdaObjectMethodTest {
@Test
public void test(){
/**
* 满足了对象办法援用条件:* 1. 第一个参数 g 类型为 Girl, 没有其它参数,阐明要调用无参办法
* 2. 同时也是 body 体调用办法的对象,run 办法刚好没有参数
*/
Consumer<Girl> c1 = (Girl g) -> g.run();
c1.accept(new Girl());
}
}
class Girl{public void run(){System.out.println("girl in running...");
}
}
有参数,无返回值
1. 第一个参数 g 类型为 Girl2, 第二个参数 String 类型,作为调用 eat 办法的参数
2. 同时 g 作为 body 体调用办法 eat 的对象
public class LambdaObjectMethodTest2 {
@Test
public void test(){
/**
* 满足了对象办法援用条件:* 1. 第一个参数 g 类型为 Girl2, 第二个参数 String 类型,作为调用 eat 办法的参数
* 2. 同时 g 作为 body 体调用办法 eat 的对象
*/
BiConsumer<Girl2,String> c1 = (Girl2 g, String f) -> g.eat(f);
c1.accept(new Girl2(),"苹果");
}
}
class Girl2{public void eat(String food){System.out.println("girl eat"+food);
}
}
有参数,有返回值
1. 第一个参数 g 类型为 Girl3, 第二个参数为 String 类型,合乎 g 对象的 getAge 的参数类型
2. 同时 g 也是 body 体调用办法 getAge 的对象,刚好参数类型及个数匹配
public class LambdaObjectMethodTest3 {
@Test
public void test() {
/**
* 满足了对象办法援用条件:* 1. 第一个参数 g 类型为 Girl3, 第二个参数为 String 类型,合乎 g 对象的 getAge 的参数类型
* 2. 同时 g 也是 body 体调用办法 getAge 的对象,刚好参数类型及个数匹配
*/
BiFunction<Girl3,String, Integer> bf1 = (Girl3 g, String name) -> g.getAge(name);
int age = bf1.apply(new Girl3(),"爱莎公主");
System.out.println(age);
}
}
class Girl3 {public Integer getAge(String name) {System.out.println(name + "is" + 20 + "old.");
return 20;
}
}
大家能够看出上述示例都是类 Girl、Girl2、Girl3 都有默认构造方法,若是带参构造方法又如何实现对象办法援用呢?作为作业留给大家练习