最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8中方法引用的使用詳解

 更新時(shí)間:2020年12月10日 08:30:46   作者:鍋外的大佬  
這篇文章主要介紹了Java 8 中的方法引用使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1. 引言

Java8中最受廣大開發(fā)中喜歡的變化之一是因?yàn)橐肓?lambda 表達(dá)式,因?yàn)檫@些表達(dá)式允許我們放棄匿名類,從而大大減少了樣板代碼,并提高了可讀性。
方法引用是lambda表達(dá)式的一種特殊類型。它們通常通過引用現(xiàn)有方法來創(chuàng)建簡(jiǎn)單的lambda表達(dá)式。

方法引用包括以下四種類型:

  • 靜態(tài)方法
  • 特定對(duì)象的實(shí)例方法
  • 特定類型的任意對(duì)象的實(shí)例方法
  • 構(gòu)造方法
  • 在本篇文章中,我們將探討Java中的方法引用。

2. 引用靜態(tài)方法

We'll begin with a very simple example, capitalizing and printing a list of Strings:

我們從一個(gè)非常簡(jiǎn)單的示例開始,字符串轉(zhuǎn)成大寫并打?。?/p>

List<String> messages = Arrays.asList("hello", "baeldung", "readers!");

我們可以通過簡(jiǎn)單的lambda表達(dá)式直接調(diào)用 StringUtils.capitalize() 方法:

messages.forEach(word -> StringUtils.capitalize(word));

或者,我們可以使用方法引用來簡(jiǎn)單地引用 capitalize 靜態(tài)方法:

messages.forEach(StringUtils::capitalize);

注意,方法引用應(yīng)使用::運(yùn)算符。

3. 引用特定對(duì)象的實(shí)例方法

為了演示這種類型的方法引用,我們新建以下這兩個(gè)類:

public class Bicycle {
 
 private String brand;
 private Integer frameSize;
 // standard constructor, getters and setters
}
 
public class BicycleComparator implements Comparator {
 
 @Override
 public int compare(Bicycle a, Bicycle b) {
  return a.getFrameSize().compareTo(b.getFrameSize());
 }
 
}

創(chuàng)建一個(gè) BicycleComparator 對(duì)象來比較自行車尺寸:

BicycleComparator bikeFrameSizeComparator = new BicycleComparator();

我們可以使用lambda表達(dá)式按尺寸大小對(duì)自行車進(jìn)行排序,但需要指定兩個(gè)自行車實(shí)例進(jìn)行比較:

createBicyclesList().stream()
 .sorted((a, b) -> bikeFrameSizeComparator.compare(a, b));

我們可以使用方法引用讓編譯器把句柄參數(shù)傳遞給我們:

createBicyclesList().stream()
 .sorted(bikeFrameSizeComparator::compare);

4. 引用特定類型任意對(duì)象的實(shí)例方法

這種類型的方法引用與前面的示例類似,但不必創(chuàng)建自定義對(duì)象來執(zhí)行比較。

讓我們創(chuàng)建一個(gè)要排序的Integer 整數(shù)列表:

List<Integer> numbers = Arrays.asList(5, 3, 50, 24, 40, 2, 9, 18);

如果我們使用經(jīng)典的 lambda 表達(dá)式,這兩個(gè)參數(shù)都需要顯式傳遞,而使用方法引用則要簡(jiǎn)單得多:

numbers.stream()
 .sorted((a, b) -> a.compareTo(b));
numbers.stream()
 .sorted(Integer::compareTo);

盡管它仍然是一行代碼,但是方法引用更容易閱讀和理解。

5. 引用構(gòu)造函數(shù)

我們可以像在第一個(gè)例子中引用靜態(tài)方法一樣引用構(gòu)造函數(shù)。唯一區(qū)別是需要使用new關(guān)鍵字。
現(xiàn)在我們用不同品牌的String列表創(chuàng)建一個(gè)Bicycle數(shù)組:

List<String> bikeBrands = Arrays.asList("Giant", "Scott", "Trek", "GT");

首先,我們將向Bicycle類添加一個(gè)新的構(gòu)造函數(shù):

public Bicycle(String brand) {
 this.brand = brand;
 this.frameSize = 0;
}

接下來,我們將使用方法引用中的新構(gòu)造函數(shù),并從原始的String列表中生成一個(gè)Bicycle數(shù)組:

bikeBrands.stream()
 .map(Bicycle::new)
 .toArray(Bicycle[]::new);

注意如何使用方法引用調(diào)用Bicycle和Array構(gòu)造函數(shù),從而使代碼看起來更加簡(jiǎn)潔明了。

6. 其他示例和限制

目前為止,方法引用是一個(gè)使代碼非常清晰和易讀的好方法。但是,我們不能用它們來代替各種lambda表達(dá)式,因?yàn)樗鼈冇幸恍┚窒扌浴?/p>

它們的主要局限性是由于它們最大的優(yōu)點(diǎn):前一個(gè)表達(dá)式的輸出需要與引用的方法聲明的輸入?yún)?shù)匹配。

看看這個(gè)限制的例子:

createBicyclesList().forEach(b -> System.out.printf(
 "Bike brand is '%s' and frame size is '%d'%n",
 b.getBrand(),
 b.getFrameSize()));

這個(gè)簡(jiǎn)單的例子不能用方法引用來表示,因?yàn)樵谖覀兊睦又校琾rintf 方法需要3個(gè)參數(shù),而使用createBicyclesList().forEach()只允許方法引用一個(gè)參數(shù)(Bicycle對(duì)象)。

最后,我們研究下,如何創(chuàng)建一個(gè)可以從lambda表達(dá)式引用的no-operation函數(shù)。

在本例中,我們希望使用lambda表達(dá)式而不使用其參數(shù)。

首先,創(chuàng)建 doNothingAtAll 方法:

private static <T> void doNothingAtAll(Object... o) {
}

因?yàn)檫@是一個(gè)varargs方法,它可執(zhí)行在任意 lambda 表達(dá)式中,而不管引用的對(duì)象或參數(shù)的數(shù)量。我們看看它的作用:

createBicyclesList()
 .forEach((o) -> MethodReferenceExamples.doNothingAtAll(o));

7. 總結(jié)

在這篇文章中,我們學(xué)習(xí)了Java中的方法引用,以及如何使用它們來替換lambda表達(dá)式,從而提高了可讀性并闡明編程的意圖。

到此這篇關(guān)于Java 8 中的方法引用使用的文章就介紹到這了,更多相關(guān)Java8 方法引用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java虛擬機(jī)內(nèi)存溢出與內(nèi)存泄漏

    Java虛擬機(jī)內(nèi)存溢出與內(nèi)存泄漏

    這篇文章主要介紹了Java虛擬機(jī)內(nèi)存溢出與內(nèi)存泄漏,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java zxing生成條形碼和二維嗎代碼實(shí)例

    Java zxing生成條形碼和二維嗎代碼實(shí)例

    這篇文章主要介紹了java zxing生成條形碼和二維嗎代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • JPA?CriteriaBuilder子查詢方式

    JPA?CriteriaBuilder子查詢方式

    這篇文章主要介紹了JPA?CriteriaBuilder子查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java數(shù)據(jù)結(jié)構(gòu)專題解析之棧和隊(duì)列的實(shí)現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)專題解析之棧和隊(duì)列的實(shí)現(xiàn)

    從數(shù)據(jù)結(jié)構(gòu)的定義看,棧和隊(duì)列也是一種線性表。其不同之處在于棧和隊(duì)列的相關(guān)運(yùn)算具有特殊性,只是線性表相關(guān)運(yùn)算的一個(gè)子集。更準(zhǔn)確的說,一般線性表的插入、刪除運(yùn)算不受限制,而棧和隊(duì)列上的插入刪除運(yùn)算均受某種特殊限制。因此,棧和隊(duì)列也稱作操作受限的線性表
    2021-10-10
  • Java實(shí)現(xiàn)統(tǒng)計(jì)文檔中關(guān)鍵字出現(xiàn)的次數(shù)

    Java實(shí)現(xiàn)統(tǒng)計(jì)文檔中關(guān)鍵字出現(xiàn)的次數(shù)

    這篇文章主要為大家分享了利用Java語言實(shí)現(xiàn)統(tǒng)計(jì)關(guān)鍵字在文檔中出現(xiàn)的次數(shù)的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-05-05
  • Spring @Cacheable自定義緩存過期時(shí)間的實(shí)現(xiàn)示例

    Spring @Cacheable自定義緩存過期時(shí)間的實(shí)現(xiàn)示例

    本文主要介紹了Spring @Cacheable自定義緩存過期時(shí)間的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • 談?wù)勗贘ava發(fā)送郵件中遇到的的問題

    談?wù)勗贘ava發(fā)送郵件中遇到的的問題

    本文介紹了在利用Java發(fā)送郵件過程中遇到的的兩個(gè)問題,以及如何解決這兩個(gè)問題。如果大家也遇到了這些問題,可以來參考借鑒。
    2016-08-08
  • Java排序?qū)崿F(xiàn)的心得分享

    Java排序?qū)崿F(xiàn)的心得分享

    這篇文章主要介紹了Java排序?qū)崿F(xiàn)的心得,有需要的朋友可以參考一下
    2014-01-01
  • FreeSWITCH跨NAT部署配置詳解

    FreeSWITCH跨NAT部署配置詳解

    這篇文章主要為大家介紹了FreeSWITCH跨NAT部署配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • java利用udp實(shí)現(xiàn)發(fā)送數(shù)據(jù)

    java利用udp實(shí)現(xiàn)發(fā)送數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了java利用udp實(shí)現(xiàn)發(fā)送數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07

最新評(píng)論

遂昌县| 东丰县| 和田县| 宁晋县| 宁晋县| 西峡县| 新巴尔虎右旗| 洛隆县| 贺兰县| 永清县| 贵溪市| 天祝| 衡阳市| 雷波县| 东丽区| 滁州市| 富宁县| 陵水| 武邑县| 兴隆县| 大丰市| 神池县| 称多县| 扎兰屯市| 青州市| 溧水县| 洪洞县| 鄂伦春自治旗| 苍山县| 鄄城县| 昌平区| 绥滨县| 酒泉市| 彭州市| 黄山市| 宝应县| 中方县| 阿鲁科尔沁旗| 贡山| 陵水| 莒南县|