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

淺談對(duì)Java雙冒號(hào)::的理解

 更新時(shí)間:2020年06月18日 14:49:31   作者:步步詠涼天  
這篇文章主要介紹了淺談對(duì)Java雙冒號(hào)::的理解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

本文為個(gè)人理解,不保證完全正確。
官方文檔中將雙冒號(hào)的用法分為4類,按照我的個(gè)人理解可以分成2類來使用。

官方文檔

官方文檔中將雙冒號(hào)的用法分為了以下4類:

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

以下是我的理解

個(gè)人理解

雙冒號(hào)的作用

在使用雙冒號(hào)前我們要先搞清楚一個(gè)問題:為什么要使用雙冒號(hào)?也就是雙冒號(hào)的作用是什么。
雙冒號(hào)的設(shè)計(jì)初衷是為了化簡(jiǎn)Lambda表達(dá)式,不熟悉Lambda表達(dá)式的同學(xué)可以先了解一下。
Lambda表達(dá)式的形式有兩種:

包含單獨(dú)表達(dá)式 :parameters -> an expression

list.forEach(item -> System.out.println(item));

包含代碼塊:parameters -> { expressions }

list.forEach(item -> {
 int numA = item.getNumA();
 int numB = item.getNumB();
 System.out.println(numA + numB);
});

使用雙冒號(hào)可以省略第一種Lambda表達(dá)式中的參數(shù)部分,即item ->和調(diào)用方法的參數(shù)這兩部分。

例如:

//不使用雙冒號(hào)
list.forEach(item -> System.out.println(item));
//使用雙冒號(hào)
list.forEach(System.out::println);

雙冒號(hào)的使用條件

使用雙冒號(hào)有兩個(gè)條件:

條件1
條件1為必要條件,必須要滿足這個(gè)條件才能使用雙冒號(hào)。
Lambda表達(dá)式內(nèi)部只有一條表達(dá)式(第一種Lambda表達(dá)式),并且這個(gè)表達(dá)式只是調(diào)用已經(jīng)存在的方法,不做其他的操作。

條件2
由于雙冒號(hào)是為了省略item ->這一部分,所以條件2是需要滿足不需要寫參數(shù)item也知道如何使用item的情況。
有兩種情況可以滿足這個(gè)要求,這就是我將雙冒號(hào)的使用分為2類的依據(jù)。

情況 舉例
Lambda表達(dá)式的參數(shù)與調(diào)用函數(shù)的參數(shù)完全一致 list.forEach(item -> System.out.println(item))
調(diào)用的函數(shù)是參數(shù)item對(duì)象的方法且沒有參數(shù) list.stream().map(item -> item.getId())

一些栗子

Lambda表達(dá)式的參數(shù)與調(diào)用函數(shù)的參數(shù)完全一致時(shí)

靜態(tài)方法調(diào)用

//化簡(jiǎn)前
list.forEach(item -> System.out.println(item));
//化簡(jiǎn)后
list.forEach(System.out::println);

非靜態(tài)方法調(diào)用

StringBuilder stringBuilder = new StringBuilder();
//化簡(jiǎn)前
IntStream.range(1, 101).forEach(item -> stringBuilder.append(item));
//化簡(jiǎn)后
IntStream.range(1, 101).forEach(stringBuilder::append);

調(diào)用構(gòu)造方法

官方給出的例子

先定義一個(gè)方法,這個(gè)方法的作用是將一個(gè)集合的內(nèi)容復(fù)制到另一個(gè)集合

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

調(diào)用這個(gè)方法

//化簡(jiǎn)前
Set<Person> rosterSetLambda = transferElements(roster, () -> new HashSet<>());
//化簡(jiǎn)后
Set<Person> rosterSet = transferElements(roster, HashSet::new);

稍微解釋一下:

調(diào)用時(shí)傳入的Lambda表達(dá)式相當(dāng)于是對(duì)Supplier的繼承,并重寫Supplier的get()方法,下面是Supplier的源碼:

@FunctionalInterface
public interface Supplier<T> {

  /**
   * Gets a result.
   *
   * @return a result
   */
  T get();
}

在transferElements()方法中調(diào)用collectionFactory.get()時(shí)相當(dāng)于調(diào)用重寫后的方法{return new HashSet<>();}

我自己寫的一個(gè)例子

第一個(gè)類:

@Data
public class ModelA {
  private String id;

  public ModelA(String id) {
    this.id = id;
  }

  public ModelA() {
  }
}

第二個(gè)類

class ClassB {
  private final List<ModelA> list = new ArrayList<>();

  public void add(String string, Function<String, ModelA> function) {
    list.add(function.apply(string));
  }
}

測(cè)試代碼

ClassB classB = new ClassB();d
//化簡(jiǎn)前
classB.add("ddd", item -> new ModelA(item));
//化簡(jiǎn)后
classB.add("ddd", ModelA::new);

調(diào)用的函數(shù)是參數(shù)item對(duì)象的方法且沒有參數(shù)時(shí)

//化簡(jiǎn)前
List<String> stringList = list.stream().map(item -> item.getId()).collect(Collectors.toList());
//化簡(jiǎn)后
List<String> stringList = list.stream().map(ModelA::getId).collect(Collectors.toList());

一種特殊情況

除了上述兩種情況可以使用雙冒號(hào)化簡(jiǎn)Lambda表達(dá)式外,還存在一種特殊情況也可以使用雙冒號(hào)。
當(dāng)Lambda表達(dá)式的參數(shù)有兩個(gè)(形如(a,b) -> an expression)時(shí),調(diào)用a的方法參數(shù)為b時(shí),例如:

String[] stringArray = {"Barbara", "James", "Mary", "John"};
//化簡(jiǎn)前
Arrays.sort(stringArray, (a,b) -> a.compareToIgnoreCase(b));
//化簡(jiǎn)后
Arrays.sort(stringArray, String::compareToIgnoreCase);

到此這篇關(guān)于淺談對(duì)Java雙冒號(hào)::的理解的文章就介紹到這了,更多相關(guān)Java雙冒號(hào)::內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Maven分模塊開發(fā)與依賴管理和聚合和繼承及屬性深入詳細(xì)介紹

    Maven分模塊開發(fā)與依賴管理和聚合和繼承及屬性深入詳細(xì)介紹

    依賴管理是項(xiàng)目管理中非常重要的一環(huán)。幾乎任何項(xiàng)目開發(fā)的時(shí)候需要都需要使用到庫(kù)。而這些庫(kù)很可能又依賴別的庫(kù),這樣整個(gè)項(xiàng)目的依賴形成了一個(gè)樹狀結(jié)構(gòu),而隨著這個(gè)依賴的樹的延伸和擴(kuò)大,一系列問題就會(huì)隨之產(chǎn)生
    2022-10-10
  • Java經(jīng)理與員工的差異實(shí)現(xiàn)方法

    Java經(jīng)理與員工的差異實(shí)現(xiàn)方法

    這篇文章主要介紹了Java經(jīng)理與員工的差異實(shí)現(xiàn)方法,需要的朋友可以參考下
    2014-03-03
  • Java利用Spire.XLS for Java輕松獲取Excel工作表的名稱

    Java利用Spire.XLS for Java輕松獲取Excel工作表的名稱

    在日常的數(shù)據(jù)處理和自動(dòng)化報(bào)告場(chǎng)景中,我們經(jīng)常需要與 Excel 文件打交道,本文將深入探討如何利用功能強(qiáng)大的 Spire.XLS for Java 庫(kù)獲取普通可見工作表的名稱,有需要的小伙伴可以了解下
    2025-10-10
  • java開發(fā)就業(yè)信息管理系統(tǒng)

    java開發(fā)就業(yè)信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java開發(fā)就業(yè)信息管理平臺(tái),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Springboot項(xiàng)目全局異常統(tǒng)一處理案例代碼

    Springboot項(xiàng)目全局異常統(tǒng)一處理案例代碼

    最近在做項(xiàng)目時(shí)需要對(duì)異常進(jìn)行全局統(tǒng)一處理,主要是一些分類入庫(kù)以及記錄日志等,因?yàn)轫?xiàng)目是基于Springboot的,所以去網(wǎng)絡(luò)上找了一些博客文檔,然后再結(jié)合項(xiàng)目本身的一些特殊需求做了些許改造,現(xiàn)在記錄下來便于以后查看
    2023-01-01
  • Java 定時(shí)器的多種實(shí)現(xiàn)方式

    Java 定時(shí)器的多種實(shí)現(xiàn)方式

    本文介紹了Java中定時(shí)器的多種實(shí)現(xiàn)方式,有此需求的朋友可以根據(jù)實(shí)際選擇適合自己的方式
    2021-06-06
  • mybatis-plus?實(shí)現(xiàn)查詢表名動(dòng)態(tài)修改的示例代碼

    mybatis-plus?實(shí)現(xiàn)查詢表名動(dòng)態(tài)修改的示例代碼

    通過MyBatis-Plus實(shí)現(xiàn)表名的動(dòng)態(tài)替換,根據(jù)配置或入?yún)⑦x擇不同的表,本文主要介紹了mybatis-plus?實(shí)現(xiàn)查詢表名動(dòng)態(tài)修改的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • SpringCloud?Sentinel服務(wù)保護(hù)詳解(請(qǐng)求限流、線程隔離、服務(wù)熔斷)

    SpringCloud?Sentinel服務(wù)保護(hù)詳解(請(qǐng)求限流、線程隔離、服務(wù)熔斷)

    這篇文章主要介紹了SpringCloud?Sentinel服務(wù)保護(hù)詳解(請(qǐng)求限流、線程隔離、服務(wù)熔斷),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • java中的異步加載new Thread()方式

    java中的異步加載new Thread()方式

    這篇文章主要介紹了java中的異步加載new Thread()方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 你還在用Synchronized?Atomic你了解不?

    你還在用Synchronized?Atomic你了解不?

    這篇文章主要介紹了你還在用Synchronized?Atomic你了解不? 文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12

最新評(píng)論

长寿区| 诸暨市| 兴山县| 泰州市| 永丰县| 迁西县| 姜堰市| 平湖市| 盐源县| 沈阳市| 大冶市| 额尔古纳市| 达尔| 隆子县| 蓝田县| 神木县| 北流市| 温泉县| 湘阴县| 嘉禾县| 富平县| 遵义县| 鹰潭市| 永丰县| 宝坻区| 休宁县| 石家庄市| 浙江省| 康保县| 上犹县| 吉隆县| 青川县| 抚松县| 辛集市| 汝城县| 同江市| 新邵县| 楚雄市| 桐乡市| 炎陵县| 嘉善县|