System.out::println; 是什麼鬼???
阿新 • • 發佈:2018-12-03
1.第一次見到該表示式的感受
第一此次見到該表示式的時候,我還不知道什麼是方法引用,當時真是一臉蒙圈,然後問了好多同事,給我的解釋也是五花八門,但我還是感覺莫名其妙,有段時間想著就當一個特例記住就好了,不要再去深究了!!!但是我這個人,在這種時候就是很難說服自己,於是有了上篇文章,再回過頭來看這個問題,其實就變得非常簡單了。
2.揭開System.out::println的神祕面紗
有過上篇部落格的鋪墊,這裡就直接上程式碼了:
package com.nrsc.lambda.MethodReference;
import java.io.PrintStream;
import java.util.function.Consumer;
public class Demo2 {
public static void main(String[] args) {
/**
* 我初次見到的寫法
*/
Consumer<String> fun = System.out::println;
fun.accept("hello world");
System.out.println("========================================" );
/**
* 現在想想其實很簡單,檢視println方法的原始碼得知println是PrintStream類中的一個非靜態方法
* 因此按照方法引用的邏輯,它肯定可以使用
* “函式式介面 變數名 = 類例項::方法名” 的方式對該方法進行引用
*
* 而System.out的作用肯定就是來獲取PrintStream類的一個類例項,
*
* 驗證程式碼如下:
*/
PrintStream out = System.out;
Consumer<String> fun2 = out::println;
fun2.accept("hello beijing");
}
}
3.為什麼不直接使用PrintStream,而要用System.out呢?
不知道大家會不會有此疑惑,反正我當時看明白System.out::println這句話的時候,就在想為什麼不直接建立PrintStream物件來構建其類例項呢?
這個問題其實只要掃一眼PrintStream類的原始碼,應該就不會再有了。PrintStream類並沒有無參構造,而其有參建構函式不是要流,就是要File檔案,想要直接通過new一個PrintStream類的方式來建立例項,將變得非常麻煩。因此,通過System.out的方式獲取一個PrintStream例項的方式才會成為實際使用的方式。