Java中雙冒號::的實現(xiàn)示例
今天給大家分享一個JDK8中的新特性雙冒號:”::“,雙冒號“::”就是 Java 中的方法引用,是Java 8中的Lambda表達式寫法之一,一種執(zhí)行方法的方法。
在一定程度上簡化了我們Java開發(fā)的冗余代碼。
雙冒號(::)使用場景一般有如下6種:
| 類型 | 引用語法 | 案例 |
|---|---|---|
| 引用靜態(tài)方法 | 類名::靜態(tài)方法名 | Integer::parseInt |
| 引用特定對象實例方法 | 對象::靜態(tài)方法名 | System.out::println |
| 引用特定類型的任意對象的實例方法 | 特定類型::實例方法名 | String::compareToIgnoreCase |
| 引用超類(父類)的實例方法 | supre::方法名 | supre::fun |
| 引用類構(gòu)造方法 | 類名::new | ArrayList::new |
| 引用數(shù)組構(gòu)造方法 | 數(shù)組類型[]::new | String[]::new |
上面的內(nèi)容太過于官方,下面我們簡單看兩個小例子:
1. Lambda表達式表達式: person -> person.getName(); 可以替換成: Person::getName 2. Lambda表達式表達式: () -> new HashMap<>(); 可以替換成: HashMap::new
在實際的開發(fā)中,我們可能還會遇到很多使用雙冒號調(diào)用方法的操作
public class Test07 {
public static void a(){
System.out.printf("a1");
}
public static void a(String s){
System.out.printf(s);
}
public static void main(String[] args) {
Runnable runnable=Test07::a;
runnable.run();
}
}
這個時候大家能看出調(diào)用的是一個a方法嗎,我們直接運行一下看一下結(jié)果:

說明Runnable對應(yīng)的是無參的方法a,這是為什么呢?
原因就在于Runnable,追蹤到它的原碼不難發(fā)現(xiàn)它是一個函數(shù)式的接口

里面只有一個無參的run方法,這個方法對應(yīng)到Runnable runnable=Test07::a就是無參的方法a
如果我們想要使用有參的方法a,那么該使用什么呢?
public class Test07 {
public static void a() {
System.out.printf("a1");
}
public static void a(String s) {
System.out.printf(s);
}
public static void main(String[] args) {
Consumer<String> consumer=Test07::a;
consumer.accept("調(diào)用有參的方法a");
}
}

通過其源碼也可以發(fā)現(xiàn),Consumer也是一個函數(shù)式接口,里面提供了一個有參的accept方法,這個方法對應(yīng)到Test07::a就是有參的方法a,執(zhí)行之后,可以看到結(jié)果如下:

看到這兒大家應(yīng)該對什么是方法引用有了一些認(rèn)知,其本質(zhì)就是Runnable或Consumer來指向一個具體的方法,至于該使用哪一個就要看指向的方法是否有參數(shù)
可能有人就會有疑慮,因為我們Consumer的accept只能接收一個方法,那么所引用的方法也就只能對應(yīng)一個參數(shù),如果是多個參數(shù)怎么辦,像下面的方法:
public static void a(String s1,String s2) {
System.out.printf(s1+s2);
}
JDK內(nèi)置了很多默認(rèn)的函數(shù)式接口,比如BiConsumer
public static void main(String[] args) {
BiConsumer<String,String> biConsumer=Test07::a;
biConsumer.accept("測試","數(shù)據(jù)");
}

可以看到它可以接收兩個參數(shù),如果參數(shù)大于等于兩個,建議將參數(shù)封裝為一個對象,通過對象去傳參
上面的內(nèi)容均是無返回結(jié)果的,因為不管是Runnable的run方法還是Consumer的accept方法,均無返回值,如果我們需要返回值則可以使用Callable

通過源碼不難發(fā)現(xiàn)Callable也是一個函數(shù)式接口,里面提供了一個無參的call方法,并且提供了返回值
public class Test07 {
public static String b(){
return "b";
}
public static void main(String[] args) throws Exception {
Callable<String> runnable=Test07::b;
String s=runnable.call();
System.out.printf(s);
}
}
到此這篇關(guān)于Java中雙冒號::的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Java 雙冒號::內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Eclipse中創(chuàng)建Web項目最新方法(2023年)
在Java開發(fā)人員中,最常用的開發(fā)工具應(yīng)該就是Eclipse,下面這篇文章主要給大家介紹了關(guān)于Eclipse中創(chuàng)建Web項目2023年最新的方法,需要的朋友可以參考下2023-09-09
Spark學(xué)習(xí)筆記 (二)Spark2.3 HA集群的分布式安裝圖文詳解
這篇文章主要介紹了Spark2.3 HA集群的分布式安裝,結(jié)合圖文與實例形式詳細分析了Spark2.3 HA集群分布式安裝具體下載、安裝、配置、啟動及執(zhí)行spark程序等相關(guān)操作技巧,需要的朋友可以參考下2020-02-02
SpringBoot靜態(tài)資源映射規(guī)則淺析
這篇文章主要介紹了SpringBoot靜態(tài)資源映射規(guī)則,今天在玩SpringBoot的demo的時候,放了張圖片在resources目錄下,啟動區(qū)訪問的時候,突然好奇是識別哪些文件夾來展示靜態(tài)資源的, 為什么有時候放的文件夾不能顯示,有的卻可以2023-02-02
SpringFramework中的數(shù)據(jù)校驗方式
這篇文章主要介紹了SpringFramework中的數(shù)據(jù)校驗方式,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-12-12

