导语
笔者之前对“方法引用”这个概念一直很模糊,只知道是JDK8的新特新,也在各大开源作品见到过,但一直不理解到底是什么东西,今天下午忙里偷闲,经过二十分钟左右的时间,彻底理解了“方法引用”是干啥的,下面就给大家说说自己的心得。
先说总结
方法引用说简单点,就是代替比较简单的Lambda表达式而已,会让你的代码看起来比较简洁易懂。
一探究竟
下面用一个小例子,来说明什么是 方法引用。
用大家最熟悉的 创建线程的步骤来说明
// 创建一个线程最原始的办法是这样的 ↓
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
/*
大家在学习lambda后,可以简化为,下面这样.
Thread类的构造参数里是一个 ()->{} 这个东东,这个代表的就是Runnable接口的run方法
*/
new Thread(() -> {
}).start();
上面我已经提到过了,方法引用的出现是为了简化 lambda表达式的,所以下面,我将用方法引用的方法,来改造这段代码~
public class Demo {
public static void main(String[] args) {
/*
使用自己的方法代替Runnable接口中的Run方法
Demo: 类名
test: 方法名
*/
new Thread(Demo::test).start();
}
public static void test () {
System.out.println("代替lambda的方法");
}
}
下面可能会有人懵逼了,为什么可以这样写?::是个什么鬼?别急,让我慢慢解答
大家仔细观察,发现我定义的test方法的参数和返回值跟Runnable接口的Run方法是一致的,
所以,可以得出结论,如果被引用的方法和原方法的参数和返回值一致的话,就可以使用方法引用。
至于::号是个什么鬼,这只是Java定义的一种写法,和lambda的() -> {}写法是一个道理,大家熟悉了记好了。
注意
- 方法引用的写法是 类名::方法名
- 被引用的方法的参数和返回值必须和原方法一致。
- 写的不全面也不权威,只是想让大家更快的了解什么是 方法引用 而已。