日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 双冒号_jdk8新特性之双冒号 :: 用法及详解

發布時間:2025/3/19 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 双冒号_jdk8新特性之双冒号 :: 用法及详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

jdk8的新特性有很多,最亮眼的當屬函數式編程的語法糖,本文主要講解下雙冒號::的用法。

概念

類名::方法名,相當于對這個方法閉包的引用,類似js中的一個function。比如:

Function?func?=??String::toUpperCase;

(Function在java.util.function包下,也是jdk8新加入的類,同級目錄下有很多函數式編程模型接口,比如Consumer/Predicate/Operator等)

func相當于一個入參和出參都為String的函數,可以直接

func.apply("abc")

接收一個參數,返回一個結果("ABC")。也可以用于代替下面的Lambda表達式:

List?l?=?Arrays.asList("a","b","c");

l.stream().map(s?->?s.toUpperCase());

l.stream().map(func);

下面自定義一個函數式接口

public?class?MyConsumer?implements?Consumer{

@Override

public?void?accept(String?s){

System.out.println(s);

}

}

下面這倆種寫法等價:

List?l?=?Arrays.asList("a","b","c");

l.forEach(new?MyConsumer<>());

l.forEach(s?->?System.out.println(s));

但是,這種寫法卻不行,編譯失敗:

l.forEach(MyConsumer::accept);

因為MyConsumer的accept方法不是靜態的,如果想使用這個方法,需要一個實例,還需要一個入參,共倆個參數。而List.forEach中需要的是consumer類型,相當于s -> {...},只有一個參數。

下面詳細分析雙冒號使用的各種情況

新建一個類,里面聲明四個代表各種情況的方法:

public?class?DoubleColon?{

public?static?void?printStr(String?str){

System.out.println("printStr?:?"?+?str);

}

public?void?toUpper(){

System.out.println("toUpper?:?"?+?this.toString());

}

public?void?toLower(String?str){

System.out.println("toLower?:?"?+?str);

}

public?int?toInt(String?str){

System.out.println("toInt?:?"?+?str);

return?1;

}

}

把它們用::提取為函數,再使用:

Consumer?printStrConsumer?=?DoubleColon::printStr;

printStrConsumer.accept("printStrConsumer");

Consumer?toUpperConsumer?=?DoubleColon::toUpper;

toUpperConsumer.accept(new?DoubleColon());

BiConsumer?toLowerConsumer?=?DoubleColon::toLower;

toLowerConsumer.accept(new?DoubleColon(),"toLowerConsumer");

BiFunction?toIntFunction?=?DoubleColon::toInt;

int?i?=?toIntFunction.apply(new?DoubleColon(),"toInt");

非靜態方法的第一個參數為被調用的對象,后面是入參。靜態方法因為jvm已有對象,直接接收入參。

再寫一個方法使用提取出來的函數:

public?class?TestBiConsumer?{

public?void?test(BiConsumer?consumer){

System.out.println("do?something?...");

}

}

下面這倆種傳入的函數是一樣的:

TestBiConsumer?obj?=?new?TestBiConsumer();

obj.test((x,y)?->?System.out.println("do?something?..."));

obj.test(DoubleColon::toLower);

總結

用::提取的函數,最主要的區別在于靜態與非靜態方法,非靜態方法比靜態方法多一個參數,就是被調用的實例。

來源:https://my.oschina.net

/wangbo888/blog/1942354

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的mysql 双冒号_jdk8新特性之双冒号 :: 用法及详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。