中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java實例分析Lambda表達式

發布時間:2022-04-24 13:36:27 來源:億速云 閱讀:164 作者:zzz 欄目:編程語言

這篇文章主要介紹“Java實例分析Lambda表達式”,在日常操作中,相信很多人在Java實例分析Lambda表達式問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java實例分析Lambda表達式”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

Java實例分析Lambda表達式

一、Lambda初識

我們知道,在Java中,接口是不能實例化的,但是接口對象可以指向它的實現類對象。如果接口連實現對象都沒有呢?那還可以使用匿名類的方式,如下:

public class JavaTest {
    public static void main(String[] args) {
        Fly fly = new Fly() {
            @Override
            public void fly(String name) {
                System.out.println(name + "飛行");
            }
        };
        fly.fly("張三");
    }}interface Fly{
    abstract void fly(String name);}

但是,使用匿名內部的方式,代碼量其實并不是非常簡潔,而為了使代碼更加的簡潔,Java引進了Lambda表達式的寫法,通過更簡單的語法,去實現這樣功能,使用Lambda表達式簡化的代碼如下:

public class JavaTest {
    public static void main(String[] args) {
        Fly fly = name -> System.out.println(name + "飛行");
        fly.fly("張三");
    }}interface Fly{
    abstract void fly(String name);}

通過Lambda表達式完成了同樣的效果,但是代碼量卻精簡了非常對,這就是Lambda表達式的魅力。

二、 函數式接口

在學習Lambda表達式的語法之前,首先要知道什么是函數式接口, 只有一個待實現方法 的接口,就叫做函數式接口。

//接口中只有一個待實現的方法 fly,所以這是函數式接口interface Fly{
     void fly(String name);}//接口中有兩個待實現的方法 這是不是函數式接口interface Run{
    void fastRun();
    void slowRun();}//接口中有兩個方法,但其中一個是已經定義好的default方法,真正需要子類去實現的方法只有一個 這是函數式接口interface Jump{
    void jump();
    default void highJump(){
        System.out.println("跳的更高");
    }}

可以在接口上加**@FunctionalInterface注解,去斷言這個接口是函數式接口,如果這個接口不是函數式接口,編譯就會提示錯誤。
Java實例分析Lambda表達式
為什么要知道什么是函數式接口呢?因為Lambda表達式去簡化一個接口的匿名類實現方式,它只
能對函數式接口起作用**。
這很容易理解,如果一個接口有多個待實現的方法,Lambda表達式就不能分辨出它現在是對接口中哪個方法進行實現。

三、Lambda表達式語法

Lambda表達式在Java語言中引入了一個操作符**“->”**,該操作符被稱為Lambda操作符或箭頭操作符。它將Lambda分為兩個部分:

左側:指定了Lambda表達式需要的所有參數
右側:制定了Lambda體,即Lambda表達式要執行的功能。
像這樣:

(parameters) -> expression
或
(parameters) ->{ statements; }

Lambda表達式的除了->和Lambda體,其他的比如參數,小括號,中括號都是可以更加參數類型、方法體代碼行數進行省略的。
以如下函數式接口的實現為例:

interface MathOperation {
        int operation(int a, int b);
    }

    interface GreetingService {
        void sayMessage(String message);
    }

    private int operate(int a, int b, MathOperation mathOperation){
        return mathOperation.operation(a, b);
    }
    
    interface NoParam{
        int returnOne();
    }

以下是lambda表達式的重要特征:

  • 可選類型聲明:Lambda表達式可以不用聲明實現方法的參數類型,編譯器可以統一識別參數值。

        // 類型聲明
        MathOperation addition = (int a, int b) -> a + b;
        // 不用類型聲明
        MathOperation subtraction = (a, b) -> a - b;
  • 可選的參數圓括號:一個參數無需定義圓括號,但沒有參數或者多個參數需要定義圓括號。

      // 不用括號
        GreetingService greetService1 = message ->
                System.out.println("Hello " + message);

        // 用括號
        GreetingService greetService2 = (message) ->
                System.out.println("Hello " + message);
  • 可選的大括號:如果主體包含了一個語句,就不需要使用大括號。

     // 多條語句不可以省略大括號
        MathOperation multiplication = (int a, int b) -> {
            int num = a+1;
            num = a + b;
            return a * b + num;
        };

        // 單條語句可以省略大括號
        MathOperation pision = (int a, int b) -> a / b;
  • 可選的返回關鍵字:如果主體只有一個表達式返回值則編譯器會自動返回值,大括號需要指定表達式返回了一個數值。

  // 多條語句的Lambda表達式如果有返回值,需要使用return
        MathOperation multiplication = (int a, int b) -> {
            int num = a+1;
            num = a + b;
            return a * b + num;
        };

        // 單條語句可以省略return
        MathOperation pision = (int a, int b) -> a / b;

四、Lambda表達式的使用范圍

Lambda表達式并不只是單單的用來簡化一個匿名類的創建,它還有更多的用法。

1、為變量賦值

上文中,對Lambda表達式的用法都是為變量賦值的寫法,這樣可以簡化匿名內部類賦值的代碼段,提高閱讀效率。

MathOperation subtraction = (a, b) -> a - b;

2、作為return結果

interface MathOperation {
        int operation(int a, int b);
    }

    MathOperation getOperation(int a, int b){
        return (a1, b1) -> a+b;
    }

3、作為數組元素

MathOperation math[] = {
                (a,b) -> a+b,
                (a,b) -> a-b,
                (a,b) -> a*b        };

4、作為普通方法或者構造方法的參數

public static void main(String args[]){

        Java8Tester java8Tester = new Java8Tester();
        java8Tester.operate(1,2,((a, b) -> a*b));

    }

    private int operate(int a, int b, MathOperation mathOperation){
        return mathOperation.operation(a, b);
    }

    interface MathOperation {
        int operation(int a, int b);
    }

五、Lambda表達式的作用域范圍

Lambda表達式表達體內,可以訪問表達體外的變量,但無法對其他變量進行修改操作。
Java實例分析Lambda表達式

六、Lambda表達式的引用寫法

在學習Lambda的時候,還可能會發現一種比較奇怪的寫法,例如下面的代碼:

// 方法引用寫法GreetingService greetingService = System.out::println;
        greetingService.sayMessage("hello world");

這里出現了一個從來沒見過的符號 :: ,這種寫法就叫做方法的引用。
顯然使用方法引用比普通的Lambda表達式又簡潔了一些。

如果函數式接口的實現恰好可以通過調用一個方法來實現,那么我們可以使用方法引用。

public class Java8Tester {


    public static void main(String args[]){

        // 靜態方法引用--通過類名調用
        GreetingService greetingService = Test::MyNameStatic;
        greetingService.sayMessage("hello");
        Test t = new Test();
        //實例方法引用--通過實例調用
        GreetingService greetingService2 = t::myName;
        // 構造方法方法引用--無參數
        Supplier<Test> supplier = Test::new;
        System.out.println(supplier.get());
    }



    interface GreetingService {
        void sayMessage(String message);
    }}class Test {
    // 靜態方法
    public static void MyNameStatic(String name) {
        System.out.println(name);
    }

    // 實例方法
    public void myName(String name) {
        System.out.println(name);
    }

    // 無參構造方法
    public Test() {
    }}

7、Lambda表達式的優缺點

優點:

  • 更少的代碼行-lambda表達式的最大好處之一就是減少了代碼量。我們知道,lambda表達式只能與功能接口一起使用。例如,Runnable 是一個接口,因此我們可以輕松地應用lambda表達式。

  • 通過將行為作為方法中的參數傳遞來支持順序和并行執行-通過在Java 8中使用Stream API,將函數傳遞給collection方法。現在,集合的職責是以順序或并行的方式處理元素。

  • 更高的效率-過使用Stream API和lambda表達式,可以在批量操作集合的情況下獲得更高的效率(并行執行)。 此外,lambda表達式有助于實現集合的內部迭代,而不是外部迭代。

缺點

  • 運行效率-若不用并行計算,很多時候計算速度沒有比傳統的 for 循環快。(并行計算有時需要預熱才顯示出效率優勢)

  • 很難調試-Lambda表達式很難打斷點,對調式不友好。

  • 不容易看懂-若其他程序員沒有學過 lambda 表達式,代碼不容易讓其他語言的程序員看懂(我學Lambda表達式的原因是看不懂同事寫的Lambda表達式代碼)

到此,關于“Java實例分析Lambda表達式”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阜康市| 清徐县| 山西省| 阿鲁科尔沁旗| 岐山县| 博野县| 广西| 察哈| 象州县| 新田县| 连云港市| 肇庆市| 洮南市| 出国| 广德县| 那曲县| 遵化市| 宁城县| 怀远县| 岳阳县| 沐川县| 永川市| 南木林县| 白沙| 佛坪县| 中山市| 永吉县| 班玛县| 光山县| 吉安县| 哈巴河县| 凤翔县| 诸城市| 五常市| 临沧市| 桐乡市| 泽普县| 孙吴县| 新化县| 昭通市| 文安县|