主题:方法引用
一、需求:
- 将“分散”在类中的方法,直接以实参的方式进行传递(避免使用匿名内部类)。
- 注意:以lamda的方式进行传递,其处理逻辑不可复用。
二、与Lamda的关系
相同目的(传递处理逻辑)下的两种不同实现手段,其都在编译期进行处理成为内部类实例。
lamda更加便捷:更方便去访问闭包环境
方法引用的可复用性更加强大:但闭包环境需要传递。
三、基础原理demo:
public class Demo04 {
public static void main(String[] args) {
//闭包环境数据:local
int local=1;
//lamda的方式:即性式处理
new Thread(()-> System.out.println("sub Thread run..."+local)).start();
//方法引用的方式:可复用性处理
new Thread(new MyRunnable(local)::run).start();
}
}
class MyRunnable implements Runnable{
int inner;
public MyRunnable(int inner) {
this.inner = inner;
}
@Override
public void run() {
System.out.println("sub Thread run..."+inner);
}
}
四、三种不同形式的“方法引用”
- 引用--静态方法
- 引用--实例方法
- 引用--当前实例的方法
下面以判断字符串是否可“空字串”为例说明三种
- 自定义MyString类,其中有静态和实例方法各一个,加上String类自身的实例方法,我们共持有三个方法,做为引用源。
class MyString {
public static boolean isEmpty(String s){
return s.length()==0?true:false;
}
public boolean isEmpty1(String s){
return s.length()==0?true:false;
}
}
- 完成测试,以不同的方式传递
public class Demo03 {
public static void main(String[] args) {
judge(s->s.length()==0?true:false);//lamda
//三种不同的方法引用
judge(MyString::isEmpty);//方法引用,引用了一个静态方法
judge(new MyString()::isEmpty1);//方法引用,引用了一个实例方法
judge(String::isEmpty);//方法引用,可以使用Predicate中的泛型实参,即:String中的“空参数并且返回boolean的实例方法”
}
public static void judge(Predicate<String> predicate){
String result= "";
boolean b=predicate.test(result);
System.out.println(b);
}
}
针对第三种方式,再举几个例子:
//方法定义形式
public static void fn4(Function<String,byte[]> fnc){}
//调用形式:
fn4(String::getBytes);
//方法定义形式
public static void fn5(Consumer<File> consumer) {}
fn5(File::deleteOnExit);
五、构造器引用
- 它是Supplier<T>接口的第二种实现
Supplier<String> supplier1=()->new String();
Supplier<String> supplier2=String::new;
- 但对于带参数的构造器,它就无能为力了。此时可以使用Function接口
//利用数组创建出对象
Function<char[],String> function=chars->new String(chars);