學習筆記之方法引用

来源:https://www.cnblogs.com/Hz-z/archive/2020/06/06/13056787.html
-Advertisement-
Play Games

方法引用 在使用Lambda表達式的時候,我們實際上傳遞進去的代碼就是一種解決方案:那參數做操作 弱國我們在Lambda中蘇哦指定的操作方案,已經有地方存在相同方案,那是否還有必要再寫重覆邏輯呢,答案肯定時沒有必要。 我們通過方法引用使用已經存在的方案 public interface PrintT ...


方法引用

在使用Lambda表達式的時候,我們實際上傳遞進去的代碼就是一種解決方案:那參數做操作
弱國我們在Lambda中蘇哦指定的操作方案,已經有地方存在相同方案,那是否還有必要再寫重覆邏輯呢,答案肯定時沒有必要。
我們通過方法引用使用已經存在的方案

public interface PrintTxt {
    void PringString(String s);
}

public class Demo {
    public static void main(String[] args) {
        usePring( s -> System.out.println(s));

        //方法引用符:  "::"
        usePring(System.out::print);

        //可推到的就是可以省略的
    }
    static void usePring(PrintTxt pt){
        pt.PringString("愛生活");
    }
}

方法引用符

  • :: 該符號為引用運算符,而它所在的表達式被稱為方法引用

  • Lambda表達式: usePring( s -> System.out.println(s));

    • 分析:拿到參數s之後通過Lambda表達式,傳遞給 System.out.println方法處理
  • 方法引用:usePring(System.out::print);
    *分析:直接使用System.out中的println方法取代Lambda,代碼更加簡潔

推導與省略

  • 如果使用Lambda,那麼根據"可推到就是可省略"的原則,無需指定參數類型,也無需指定的重載形式,他們都將被自動推導
  • 如果使用方法引用,也是同樣可以根據上下文進行推導
  • 方法引用時Lambda的孿生兄的

Lambda表達式支持的方法引用

常見引用方式:

  • 引用類方法
  • 引用對象的實例方法
  • 引用類的實例方法
  • 引用構造器
引用類方法

其實就是引用靜態的方法

  • 格式:類名::靜態方法
  • 例:Integer::parseInt
    • Integer類的方法:public static int parseInt(String s)將此String傳喚為int類型數據
public interface Converter {
    int convert(String s);
}
public class Demo {
    public static void main(String[] args) {

        //Lambda表達式
        useConverter(s ->  Integer.parseInt(s));

        //引用類方法
        useConverter(Integer::parseInt);

        //Lambda表達式被類方法替代的時候,它的形式參數全部傳遞給靜態方法作為參數
    }
    private static void useConverter(Converter c){
        int convert = c.convert("1234");
        System.out.println(convert);
    }
}
引用對象的實例方法

就是引用類中的成員方法

  • 格式:對象::成員方法
  • 例:"HelloWorld"::toUpperCase
    • String類中的方法:public String toUpperCase()將此String所有字元轉換為大寫
public interface Printer {
    void printUpperCase(String s);
}
public class PrintString {
    public void printUpper(String s){
        String s1 = s.toUpperCase();
        System.out.println(s1);
    }
}
public class Demo {
    public static void main(String[] args) {

        //Lambda表達式
        usePrinter(s -> System.out.println(s.toUpperCase()));

        //引用對象的實例方法
        PrintString ps = new PrintString();
        usePrinter(ps::printUpper);

        //Lambda表達式被對象的實例方法代替的時候,它的形式參數全部傳遞給該方法作為參數

    }
   private static void usePrinter(Printer p){
        p.printUpperCase("HelloWorld");
    }
}
引用類的實例方法

其實就是引用類中的成員方法

  • 格式:類名::成員方法
  • 例:String::substring
    • String 類中的方法:public String usbstring(int beginIndex,int endIndex)
    • 從beginIndex開始到endIndex結束,截取字元串。返回一個字串,字串的長度為endIndex-beginIndex
public interface MyString {
    String mySubString(String s, int x, int y);
}
public class Demo {
    public static void main(String[] args) {
        //Lambda表達式
        useMyString((s,x,y) -> s.substring(x,y));


        //引用類的實例方法
        useMyString(String::substring);

        //Lambda表達式被類的實例方法替代的時候
        //第一個參數作為調用者
        //後面的參數全部傳遞給該方法作為參數
    }
    private static void useMyString(MyString m){
        String s = m.mySubString("Helloworld", 2, 8);
        System.out.println(s);
    }
}
引用構造器

就是引用構造方法

  • 格式:類名::new
  • 例:Student::new
public interface StudentBuilder {
    Student build(String name,int age);
}
public class Student {
    String name;
    int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
public class Demo {
    public static void main(String[] args) {
        //Lambda表達式
        useStudentBuilder(((name, age) -> new Student(name,age)));
        //引用構造器
        useStudentBuilder(Student::new);
        //Lambda表達式被構造器代替的時候,它的形式參數全部傳遞給構造器作為參數
    }
    private static void useStudentBuilder(StudentBuilder sb){
        Student s = sb.build("張三", 20);
        System.out.println(s.getName()+","+s.getAge());
    }
}

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

-Advertisement-
Play Games
更多相關文章
  • 消息中間件作為分散式系統的重要成員,各大公司及開源均有許多解決方案。目前主流的開源解決方案包括RabbitMQ、RocketMQ、Kafka、ActiveMQ等。消息這個東西說簡單也簡單,說難也難。簡單之處在於好用方便,接入簡單使用簡單,非同步操作能夠解耦系統間的依賴,同時失敗後也能夠追溯重試。難的地 ...
  • 0 專輯概述 etcd 是雲原生架構中重要的基礎組件,由 CNCF 孵化托管。etcd 在微服務和 Kubernates 集群中不僅可以作為服務註冊與發現,還可以作為 key-value 存儲的中間件。 《徹底搞懂 etcd 系列文章》將會從 etcd 的基本功能實踐、API 介面、實現原理、源碼分 ...
  • 狀態模式用於解決系統中複雜對象的狀態轉換以及不同狀態下行為的封裝問題 模式動機 很多情況下,一個對象的行為取決於一個或多個動態變化的屬性,這樣的屬性叫做狀態。一個對象可以擁有多個狀態,這些狀態可以相互轉換,當對象狀態不同時,其行為也有所差異。 假設一個人就是對象,人根據心情不同會有很多狀態,比如開心 ...
  • 對於python中pip安裝庫文件超時問題 找了好多方法,發現更換安裝源最適合我 方案一:對於比較小的庫,可以延時處理 pip --default-timeout=100 install -U pip pip --default-timeout=100 install 第三方庫名方案二:更換安裝源 ...
  • https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1591472927710&di=fdd3da90a98ed401c87ddaf96fdbade2&imgtype=0&src=http%3A%2F%2F5b098... ...
  • 一 安裝jdk zookeeper是採用java開發的,所以需要依賴jdk環境,我們需要先安裝jdk,最便捷的方式就是採用yum,但是yum的官方源速度很慢,我們可以先更換yum源; #備份初始源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos ...
  • 內容不涉及演算法相關內容,paxos演算法,zab協議等網路上已經有很多優秀的文章,這裡就不獻醜了 什麼是Zookeeper ZooKeeper是分散式應用程式的分散式協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個為分散式應用提供一致性服務的軟體,提 ...
  • 出現這種問題,我這裡遇到的原因是因為上一次查詢的結果集沒有釋放完全,導致查詢失敗 此時的錯誤內容是:Commands out of sync; you can't run this command now 該錯誤內容由mysql_error(conn)語句輸出。 如果你在上次查詢時忘了調用mysql ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...