樂位元組-Java8新特性之方法引用

来源:https://www.cnblogs.com/lotbyte/archive/2019/04/08/10673357.html
-Advertisement-
Play Games

上一篇小樂介紹了《Java8新特性-函數式介面》,大家可以點擊回顧。這篇文章將接著介紹Java8新特性之方法引用。 上一篇小樂介紹了《Java8新特性-函數式介面》,大家可以點擊回顧。這篇文章將接著介紹Java8新特性之方法引用。 Java8 中引入方法引用新特性,用於簡化應用對象方法的調用, 方法 ...


 

上一篇小樂介紹了《Java8新特性-函數式介面》,大家可以點擊回顧。這篇文章將接著介紹Java8新特性之方法引用。

 

Java8 中引入方法引用新特性,用於簡化應用對象方法的調用, 方法引用是用來直接訪問類或者實例的已經存在的方法或者構造方法。 方法引用提供了一種引用而不執行方法的方式,它需要由相容的函數式介面構成的目標類型上下文。計算時,方法引用會創建函數式介面的一個實例。 當Lambda表達式中只是執行一個方法調用時,不用Lambda表達式,直接通過方法引用的形式可讀性更高一些。方法引用是一種更簡潔易懂的Lambda表達式。

 

 

1、基本格式

方法引用使用一對冒號 :: 來簡化對象方法的調用,當你想要使用方法引用時,目標引用放在分隔符 :: 前,方法名稱放在後面, 如下形式:

方法引用參考示例:

 

2、方法引用分類

Java8 中對於方法引用主要分為三大類:

  • 構造器引用 Class::new

  • 靜態方法引用 Class::static_method

  • 特定對象的方法引用 instance::method

 

2.1、構造器引用

語法是Class::new,或者更一般的Class< T >::new實例如下

藉助構造器引用實例化Iphone 對象,代碼如下:

public class IPhone {
    private Integer id;
    private String version;
    private Date createTime;
    private String name;
​
    public IPhone() {
    }
​
    public IPhone(Integer id) {
        this.id = id;
    }
​
    public IPhone(Integer id, String name) {
        this.id = id;
        this.name = name;
    }
    ...
}
​
​
public static void main(String[] args) {
        /**
         * 構造器引用
         * 無參構造器
         */
        // 實現Supplier 介面 通過構造器引用
        Supplier<IPhone> factory01= IPhone::new;
        IPhone p01 = factory01.get();
        System.out.println(p01);
​
        /**
         *  等價的Lambda 寫法
         */
        Supplier<IPhone> factory02 = ()->new IPhone();
        IPhone p02 = factory02.get();
        System.out.println(p02);
    
    
    
        /**
         * 當構造器方法存在參數 參數個數為1個時
         */
        Function<Integer,IPhone> factory03 = IPhone::new;
        IPhone p03 = factory03.apply(2019);
        System.out.println(p03);
​
        /**
         * 等價的Lambda 寫法
         */
        Function<Integer,IPhone> factory04 = (id)-> new IPhone(id);
        IPhone p04 = factory04.apply(2019);
        System.out.println(p04);
    
    
        /**
         * 當構造器方法存在參數 參數個數為2個時
         */
        BiFunction<Integer,String,IPhone> factory05 = IPhone::new;
        IPhone p05 = factory05.apply(2019,"iphoneX");
        System.out.println(p05);
​
        /**
         * 等價的Lambda 寫法
         */
        BiFunction<Integer,String,IPhone> factory06 = (id,name)-> new IPhone(id,name);
        IPhone p06 = factory06.apply(2019,"iphoneMax");
        System.out.println(p06);
      /**
         當構造器參數參過2個時怎麼解決呢???
      **/
    }

  

2.2、靜態方法引用

語法是Class::static_method,實例如下:

使用靜態方法引用 執行IPhone 靜態方法

public class IPhone {
    private Integer id;
    private String version;
    private Date createTime;
    private String name;

    public IPhone() {
    }

    public IPhone(Integer id) {
        this.id = id;
    }

    public IPhone(Integer id, String name) {
        this.id = id;
        this.name = name;
    }


	/**
	   靜態方法
	*/
    public  static  void info(){
        System.out.println("這是一部IPhone");
    }
}

/**
 * 定義函數式介面
 */
@FunctionalInterface
public interface PrintFunction{
    void print();
}

 //  靜態方法引用
PrintFunction pf01= IPhone::info;
pf01.print();
/**
  * 等價的Lambda 寫法
*/
PrintFunction pf02 = () -> {
    IPhone.info();
};
pf02.print();


// 靜態方法引用 靜態方法存在參數時
/**
 * 定義函數式介面
 */
@FunctionalInterface
public interface PrintFunction02<T,R> {
    R print(T t);
}

/**
  * 靜態方法引用  方法存在參數時
 */
PrintFunction02<String,Double> pf03 = IPhone::getPrice;
System.out.println(pf03.print("iphone"));

/**
 * 等價的Lambda 寫法
 */
PrintFunction02<String,Double> pf04 =(str)->{
    return IPhone.getPrice(str);
};

 

2.3、特定類的任意實例化對象的方法引用

語法是instance::method ,此時引用方法時必須存在實例,示例代碼如下:

 

/**
 * 構造器引用 實例化對象
 * 成員方法引用
*/
BiFunction<Integer,String,IPhone> factory07= IPhone::new;
IPhone p07 = factory07.apply(2019,"iphoneX");
PrintFunction pp= p07::mm;
pp.print();

/**
 * 等價的Lambda 寫法
 */
BiFunction<Integer,String,IPhone> factory08 = (id,name)-> new IPhone(id,name);
IPhone p08 = factory08.apply(2019,"iphoneMax");
PrintFunction pp02 = ()->{
    p08.mm();
};
pp02.print();

  

2.4 類的成員方法引用

(略)
接下來,小樂會繼續介紹Java8新特性之Stream,敬請期待。歡迎關註樂位元組,記得評論點贊哦。
轉發請記得註明出處和作者。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、請求鉤子 在客戶端和伺服器交互的過程中,有些準備工作或稍微工作是需要處理的,比如:在請求開始時,建立資料庫連接;在請求開始時,根據需求進行許可權校驗;在請求結束時,指定數據的交互格式等。為了讓每個視圖函數避免編寫重覆功能的代碼,flask提供了通用設施的功能,即請求鉤子。 例子: 運行結果: 第1 ...
  • 概念 公平鎖/非公平鎖 公平鎖是指多個線程按照申請鎖的順序來獲取鎖。 非公平鎖是指多個線程獲取鎖的順序並不是按照申請鎖的順序,有可能後申請的線程比先申請的線程優先獲取鎖。有可能,會造成優先順序反轉或者饑餓現象。 對於 Java ReentrantLock而言,通過構造函數指定該鎖是否是公平鎖,預設是非 ...
  • "概要" "schema" "changeset" "struct" "map" "總結" 概要 Ecto 中, 對資料庫的操作中經常用到 4 個類型: schema changeset struct map 在 Ecto 的 API 中, 基本都是都是對這 4 個類型的操作, 這 4 個類型的關係 ...
  • (1) np.mashgrid()函數: 生成網路點坐標矩陣,可以是二維網路矩陣,也可以是三維網路矩陣。其中,每個交叉點就是網路點,描述這些網路點的矩陣就是坐標矩陣(橫坐標矩陣X中的每個元素與縱坐標矩陣Y中對應位置元素,共同構成一個點的完整坐標)。 背景示例:網路點與坐標矩陣的解釋如下: impor ...
  • 之前在CSDN上也寫了幾篇技術的博客,大部分在Onenote裡面記錄學習過程,在寫筆記中也大量參閱CNblog和CSDN, 突然發現CNblog的界面清晰簡潔,因此發佈在網上也可以幫助到更多的人解決學習過程中類似的問題。 ...
  • 多線程 什麼是鎖? - 鎖通常被用來實現對共用資源的同步訪問。 - 為每一個共用資源創建一個Lock對象,當你需要訪問該資源時,調用acquire方法來獲取鎖對象(如果其它線程已經獲得了該鎖,則當前線程需等待其被釋放),待資源訪問完後,再調用release方法釋放鎖: GIL(Global Inte ...
  • 註:請在linux系統下測試本文中出現的代碼。以下是一些優秀程式員的回答,特此譯註。 Andrew Weimholt 的回覆: switch語句中的case 關鍵詞可以放在if-else或者是迴圈當中 Brian Bi 的回覆: 1. 聲明緊隨用途之後 理解聲明有一條很簡單的法則,不過不是什麼“從左 ...
  • Java的註解非但是一種標記,還是一種特殊的類型,並且擁有專門的類型定義。前面介紹的五種內置註解,都可以找到對應的類型定義代碼,例如查看註解@Override的源碼,發現它的代碼定義是下麵這樣的: 又如註解@FunctionalInterface,它的源碼定義與之類似: 乍看過去,註解的定義竟與介面 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...