国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 深入理解Java8雙冒號(hào)::的使用

深入理解Java8雙冒號(hào)::的使用

2020-09-19 00:27aigoV Java教程

這篇文章主要介紹了深入理解Java8雙冒號(hào)::的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、方法引用

java8允許我們使用lambda表達(dá)式創(chuàng)建匿名方法。但有時(shí)lambda表達(dá)式除了調(diào)用現(xiàn)有方法之外什么也不做。在這些情況下,通過(guò)名稱(chēng)引用現(xiàn)有的方法,通常能更直白的表現(xiàn)出方法的調(diào)用過(guò)程。對(duì)于已經(jīng)存在的且具有方法名稱(chēng)的方法,它其實(shí)是簡(jiǎn)潔且易于讀取的一種lambda表達(dá)式,或者說(shuō)是對(duì)lambda表達(dá)式的一種進(jìn)一步簡(jiǎn)化。

現(xiàn)在我們來(lái)看看下面這個(gè)“person”類(lèi):

public class Person {

  public enum Sex {
    MALE, FEMALE
  }

  String name;
  LocalDate birthday;
  Sex gender;
  String emailAddress;

  public int getAge() {
    // ...
  }
  
  public Calendar getBirthday() {
    return birthday;
  }  

  public static int compareByAge(Person a, Person b) {
    return a.birthday.compareTo(b.birthday);
  }}

假設(shè)你的社交網(wǎng)絡(luò)應(yīng)用程序的成員包含在一個(gè)數(shù)組中,并且你希望按年齡對(duì)數(shù)組進(jìn)行排序。你可以使用以下代碼:

Person[] rosterAsArray = roster.toArray(new Person[roster.size()]);

class PersonAgeComparator implements Comparator<Person> {
  public int compare(Person a, Person b) {
    return a.getBirthday().compareTo(b.getBirthday());
  }
}
    
Arrays.sort(rosterAsArray, new PersonAgeComparator());

上面最后一行代碼:深入理解Java8雙冒號(hào)::的使用中的sort方法源碼如下:

static <T> void sort(T[] a, Comparator<? super T> c)

注意,接口comparator是一個(gè)功能接口。因此,你可以使用lambda表達(dá)式,而不是定義并創(chuàng)建實(shí)現(xiàn)comparator的類(lèi)的新實(shí)例,所以上上面的代碼可以用lambda表達(dá)式改寫(xiě)成下面這樣:

Arrays.sort(rosterAsArray,  (Person a, Person b) -> {    return a.getBirthday().compareTo(b.getBirthday());  });

但是,我們已經(jīng)在Person bean對(duì)象中提前寫(xiě)好了用來(lái)比較兩個(gè)person對(duì)象的出生日期的方法:深入理解Java8雙冒號(hào)::的使用,所以你其實(shí)可以在lambda表達(dá)式的主體中直接調(diào)用這個(gè)方法方法:

Arrays.sort(rosterAsArray,
  (Person a, Person b) -> {
    return a.getBirthday().compareTo(b.getBirthday());
  }
);

因?yàn)檫@個(gè)上面這個(gè)lambda表達(dá)式是在調(diào)用現(xiàn)有的方法,所以我們這里就可以使用上面提到的使用方法引用方式(及雙冒號(hào) ::),而不是之前我們熟悉的lambda表達(dá)式:

Arrays.sort(rosterAsArray, Person::compareByAge);

方法引用 person::comparebyage 在語(yǔ)義上與lambda表達(dá)式(a,b)->person.comparebyage(a,b)相同。他們都有以下特點(diǎn):

  • 它的形參列表復(fù)制自comparator<person>.compare,即(Person, Person)。
  • 它的主體調(diào)用方法是:person.comparebyage。

二、方法引用的種類(lèi)(哪些場(chǎng)景可以使用方法引用)

有四種方法引用:

 

種類(lèi)

案例
引用靜態(tài)方法 ContainingClass::staticMethodName
對(duì)特定對(duì)象的實(shí)例方法的引用 containingObject::instanceMethodName
對(duì)特定類(lèi)型的任意對(duì)象的實(shí)例方法的引用 ContainingType::methodName
對(duì)構(gòu)造函數(shù)的引用 ClassName::new

 

1、引用靜態(tài)方法

例如:

Person::comparebyage 是對(duì)Person類(lèi)的靜態(tài)方法 comparebyage 的引用。

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

以下是對(duì)特定對(duì)象的實(shí)例方法的引用示例:

class ComparisonProvider {
  public int compareByName(Person a, Person b) {
    return a.getName().compareTo(b.getName());
  }
    
  public int compareByAge(Person a, Person b) {
    return a.getBirthday().compareTo(b.getBirthday());
  }
}
ComparisonProvider myComparisonProvider = new ComparisonProvider();
Arrays.sort(rosterAsArray, myComparisonProvider::compareByName);

方法引用   myComparisonProvider::compareByName 調(diào)用對(duì)象myComparisonProvider的一部分方法 compareByName。然后JRE會(huì)自動(dòng)推斷方法類(lèi)型參數(shù),在這種情況下為(Person, Person)。

3、引用特定類(lèi)型的任意對(duì)象的實(shí)例方法

以下是對(duì)特定類(lèi)型的任意對(duì)象的實(shí)例方法的引用示例:

String[] stringArray = { 
  "Barbara", "James", "Mary", "John",
  "Patricia", "Robert", "Michael", "Linda"
 };

Arrays.sort(stringArray, String::compareToIgnoreCase);

方法引用  string::compareTogignoreCase  的等效lambda表達(dá)式會(huì)有形參列表(String a,String b),其中a和b是用于更好地描述此示例的任意名稱(chēng)。這次的方法引用,將調(diào)用方法a.CompareTognoreCase(b)。

這里官網(wǎng)原文可能說(shuō)的不是很清楚,也有點(diǎn)拗口,多說(shuō)一句:

如何理解:對(duì)特定類(lèi)型的 任意對(duì)象的 實(shí)例方法的引用  這句話呢?

實(shí)際上上面代碼沒(méi)有在特定實(shí)例(也就是沒(méi)有new一個(gè)指定的String 實(shí)例出來(lái),像這樣:String s = new String() ,s就是一個(gè)指定的String對(duì)象的實(shí)例)上引用方法 compareTogignoreCase ,而是在String類(lèi)自身引用的。

我們進(jìn)入Arrays.sort(xx,xx)方法源碼,我們可以看到這個(gè)數(shù)組排序方法底層算法涉及循環(huán),那么深入理解Java8雙冒號(hào)::的使用這行代碼我們可以想象它會(huì)在每循環(huán)到數(shù)組的一個(gè)String元素時(shí),以這個(gè)String元素所屬類(lèi)型對(duì)象(其實(shí)就是String對(duì)象)的身份去調(diào)用compareTogignoreCase方法,即:

深入理解Java8雙冒號(hào)::的使用會(huì)調(diào)用深入理解Java8雙冒號(hào)::的使用的compareTogignoreCase   --》String Barbara = new String(); Barbara.compareTogignoreCase   

深入理解Java8雙冒號(hào)::的使用會(huì)調(diào)用深入理解Java8雙冒號(hào)::的使用的compareTogignoreCase  --》String James= new String();James.compareTogignoreCase  

以此類(lèi)推。。。

我可能解釋的也不太好,主要就是想語(yǔ)言上理解一下:對(duì)特定類(lèi)型的 任意對(duì)象的 實(shí)例方法 的引用

深入理解Java8雙冒號(hào)::的使用

4、引用構(gòu)造函數(shù)

你可以通過(guò)使用name new 的方式引用構(gòu)造函數(shù),這與靜態(tài)方法的引用方式類(lèi)似。

下面這個(gè)示例方法,是將元素從一個(gè)集合復(fù)制到另一個(gè)集合。我們將以這個(gè)方法為例,講解如何使用方法引用的方式引用構(gòu)造函數(shù)。

public static <T, SOURCE extends Collection<T>, DEST extends Collection<T>>
  DEST transferElements(SOURCE sourceCollection,Supplier<DEST> collectionFactory) {
    
    DEST result = collectionFactory.get();

    for (T t : sourceCollection) {
      result.add(t);
    }

    return result;
}

函數(shù)接口supplier包含一個(gè)無(wú)參但返回一個(gè)對(duì)象的get方法,源碼可見(jiàn),他返回的類(lèi)型就是泛型的類(lèi)型,如下:

深入理解Java8雙冒號(hào)::的使用

因此,可以使用lambda表達(dá)式調(diào)用方法transferElements,如下所示:

Set<Person> rosterSetLambda =
  transferElements(roster, () -> { return new HashSet<>(); });

可以使用構(gòu)造函數(shù)引用代替lambda表達(dá)式,如下所示:

Set<Person> rosterSet = transferElements(roster, HashSet::new);

上面代碼,Java編譯器執(zhí)行的時(shí)候會(huì)自動(dòng)推斷出這里想要?jiǎng)?chuàng)建一個(gè)包含Person類(lèi)型元素的hashset集合。當(dāng)然你也可以顯示的指定類(lèi)型,如下:

Set<Person> rosterSet = transferElements(roster, HashSet<Person>::new);

到此這篇關(guān)于深入理解Java8雙冒號(hào)::的使用的文章就介紹到這了,更多相關(guān)Java8雙冒號(hào)::內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://blog.csdn.net/aigoV/article/details/102586953

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美精品成人 | 日韩免费电影 | 色二区| 国产在线观看免费 | 亚洲精品影院在线 | av色资源| 亚洲高清视频网站 | 伊人6| www.久久久| 亚洲国产精品久久久久婷婷老年 | 国产日韩欧美综合 | 精品中文字幕在线 | 五月宗合网 | 看特级毛片 | 亚洲 欧美 综合 | 99草视频 | 台湾一级特黄aa大片免费看 | 久久久久久中文字幕 | 久久综合一区二区三区 | 韩日av在线| 欧美日韩不卡合集视频 | 亚洲成人自拍 | 亚洲一区二区中文字幕 | 国产一级一级国产 | 青青久草在线 | 国产午夜精品一区二区三区嫩草 | 国产成人高清 | 久久久精品综合 | 日韩精品三区 | 三级国产网站 | 国产视频一区二区视频 | 久久精品久久综合 | 在线精品一区二区 | 日本久久免费 | 中文字幕一区在线观看视频 | 国产精品久久久久久久浪潮网站 | 日本一区不卡 | 亚洲一区二区三区视频 | 性欧美久久久 | 日本一区二区中文字幕 | 好吊色欧美一区二区三区四区 |