學習筆記之Lambda表達式

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

Lambda表達式 函數式編程: 函數: 函數就是有輸入量、輸出量的一套計算方案,也就是“拿數據做操作”面向對象思想強調“必須通過對象的形式來做事情” 函數式思想: 儘量忽略面向對象的複雜語法:“強調做什麼,而不是以什麼形式去做”,Lambda表達式就是函數思想的體現 例1: 需求:啟動一個線程,在 ...


Lambda表達式

函數式編程:

函數:

  • 函數就是有輸入量、輸出量的一套計算方案,也就是“拿數據做操作”面向對象思想強調“必須通過對象的形式來做事情”
    函數式思想:
  • 儘量忽略面向對象的複雜語法:“強調做什麼,而不是以什麼形式去做”,Lambda表達式就是函數思想的體現

例1:

需求:啟動一個線程,在控制太輸出一句話:多線程程式啟動了
方式一:

public class Demo {
    public static void main(String[] args) {
        MyRunnable mr = new MyRunnable();
        Thread t = new Thread(mr);
        t.start();
    }
}

public class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("多線程程式啟動了");
    }
}

方式二:

  • 匿名內部類
public class Demo {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("多線程程式啟動了");
            }
        }).start();
    }
}

方式三:

  • Lambda表達式:
public class LambdaDemo {
    public static void main(String[] args) {
        new Thread(() -> {
            System.out.println("多線程程式啟動了");
        }).start();
    }
}

Lambda標準格式:

匿名內部類中重寫run()方法的代碼分析

new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("多線程程式啟動了");
            }
        }).start();
  • 方法形式參數為空,說明調用方法時不需要傳遞參數
  • 方法返回值為void,說明方法執行沒有結果返回
  • 方法體中的內容,時我們具體要做的事情

Lambda表達式的代碼分析

 new Thread(() -> {
            System.out.println("多線程程式啟動了");
        }).start();
  • ():裡面沒有內容,可以看成是方法形式為空
  • ->:用箭頭指向後面要做的事情
  • {}:包含一段代碼,我們稱之為代碼塊,可以看成是方法體中的內容

Lambda表達式的三要素:形式參數,箭頭,代碼塊
Lambda表示的格式

  • 格式:(形式參數) -> {代碼塊}
  • 形式參數:如果有多個參數,參數之間用逗號隔開;如果沒有參數,留空
  • ->:由英文中畫線和大於符號組成,固定寫法,代表指向性動作
  • 代碼塊:具體要做的事情,也就是之前寫方法體的內容

練習

Lambda表達式的使用前提:

  • 有一個介面
  • 介面中有且只有一個抽象方法
練習一:
  • 定義一個介面(Eatable),裡面定義一個抽象方法:void eat():
  • 定義一個測試類(Demo),在測試類中提供兩個方法
    • 一個方法是:useEatable(Eatable e)
    • 一個方法是主方法,在主方法中調用useEatable方法
public interface Eatable {
     void eat();
}


public class Demo {
    public static void main(String[] args) {
        useEatable(() -> {
            System.out.println("Hello,World");
        });

    }
    private static void useEatable(Eatable e){
        e.eat();
    }
}

練習二:
  • 定義一個介面(Flyable),裡面定義一個抽象方法:void fly(String s):
  • 定義一個測試類(Demo),在測試類中提供兩個方法
    • 一個方法是:useEatable(Flyable f)
    • 一個方法是主方法,在主方法中調用useFlyable方法
public interface Flyable {
    void fly(String s);
}


public class Demo {

    public static void main(String[] args) {

        //匿名內部類:
        useFlyable(new Flyable() {
            @Override
            public void fly(String s) {
                System.out.println(s);
                System.out.println("風和日麗");
            }
        });
        System.out.println("---------------");
        //Lambda表達式
        useFlyable((String s) -> {
            System.out.println(s);
            System.out.println("風和日麗");
        });
    }
    private static void useFlyable(Flyable f){
        f.fly("晴空萬里");
    }
}
練習三:
  • 定義一個介面(Addable),裡面定義一個抽象方法:int add(int x, int y)
  • 定義一個測試類(Demo),在測試類中提供兩個方法
    • 一個方法是:useAddable(Addable a)
    • 一個方法是主方法,在主方法中調用useAddable方法
public interface Addable {
    int add(int x, int y);
}

public class Demo {
    public static void main(String[] args) {
        //匿名內部類

        useAddable(new Addable() {
            @Override
            public int add(int x, int y) {
                return x + y;
            }
        });
        System.out.println("------------");
        
        //Lambda表達式
        useAddable((int x, int y) -> {
            return x + y;
        });
    }

    private static void useAddable(Addable a) {
        int sum = a.add(3, 4);
        System.out.println(sum);
    }
}

Lambda省略模式

public class Demo {
    public static void main(String[] args) {
        //無省略
        useAddable((int x, int y) -> {
            return x + y;
        });

        useFlyable((String s) -> {
            System.out.println(s);
        });

        System.out.println("------------");
        //參數類型省略
        useAddable((x, y) -> {
            return x + y;
        });

        useFlyable(s -> {
            System.out.println(s);
        });
        System.out.println("----------------");
        //若代碼塊有且只有一條語句,可以省略大括弧和分號,若有return語句也要省略return;
        useAddable((x, y) -> x + y);

        useFlyable(s -> System.out.println(s));

    }

    private static void useAddable(Addable a) {
        int sum = a.add(10, 30);
        System.out.println(sum);
    }

    private static void useFlyable(Flyable f) {
        f.fly("陽光明媚,風和日麗");
    }
}

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

-Advertisement-
Play Games
更多相關文章
  • from pptx import Presentation prs=Presentation('名字.pptx') for slide in prs.slides: # 讀取每一頁幻燈片 for shape in slide.shapes: #獲取每一頁的內容 if shape.has_text_f ...
  • 對於文件,我們並不陌生,文件是數據源(保存數據的地方)的一種,比如大家經常使用的word文檔,txt文件,Excel文件...等等都是文件。文件最主要的作用就是保存數據,它既可以保存一張圖片,也可以保存視頻,聲音...... 文件在程式中是以流的形式來操作的。 流:數據在數據源(文件)和程式(記憶體) ...
  • import pdfplumber pdf=pdfplumber.open(',,,,,,,.pdf') first_page=pdf.pages[0] print(first_page.extract_text()) #列印第一頁內容 #提取其中的表格 first_page.extract_tab ...
  • 右鍵項目,maven選項,"Open setting.xml"或"Create setting.xml",在 mirrors 節點添加下麵代碼。 <mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://ma ...
  • JVM記憶體結構,封裝性的體現,可變個數形參的方法,java的值傳遞機制,關鍵字:this,JDK中的主要包介紹 ...
  • from docx import Document word=Document() word.add_heading('一級標題',level=1) #增加一級標題 p1=word.add_paragraph('這是第一段') p2=word.add_paragraph('這是第二段') p3=wo ...
  • from docx import Document word=Document(',,,,,,.docx') paragraphs=word.paragraphs #返回一個列表,有多少段就有多少個值 for i in paragraphs: print(i.text) #列印每段內容 a=para ...
  • from docx import Document word =Document(r'表格名稱.docx') #讀取表格 tables=word.tables for i in tables[:]: for j,row in enumerate(i.rows[:]): row_content=[] ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...