成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java的Lambda表達(dá)式

周國(guó)輝 / 1083人閱讀

摘要:的表達(dá)式什么是表達(dá)式簡(jiǎn)單的說(shuō),表達(dá)式就是匿名方法。如下線程可以看到使用匿名內(nèi)部類的話就省略了新建接口的實(shí)現(xiàn)類這一步驟。

Java的Lambda表達(dá)式 1. 什么是Lambda表達(dá)式

簡(jiǎn)單的說(shuō),Lambda表達(dá)式就是匿名方法。Lambda表達(dá)式讓程序員能夠使用更加簡(jiǎn)潔的代碼,但是同樣也使代碼的可讀性比較差。

Lambda表達(dá)式也叫做匿名方法或者閉包。

2. 和匿名內(nèi)部類做對(duì)比

Lambda是匿名方法,這個(gè)時(shí)候我們會(huì)想想到匿名內(nèi)部類,我們來(lái)回想一下匿名內(nèi)部類的用法,比如下面的代碼就是使用匿名內(nèi)部類實(shí)現(xiàn)了一個(gè)線程。

public class Test {
  public static void main(String[] args) {
    Thread t = new Thread(new Runnable() {
      @Override
      public void run() {
        System.out.println("線程:" + Thread.currentThread().getName());
      }
    });
    t.start();
  }
}

我們一般的做法是寫一個(gè)Runnable接口的實(shí)現(xiàn)類,然后new一個(gè)實(shí)現(xiàn)類再傳給Thread的構(gòu)造器。如下:

public class Test {

  public static void main(String[] args) {
    MyThread myThread = new MyThread();
    Thread t = new Thread(myThread);
    t.start();
  }

  static class MyThread implements Runnable {
    @Override
    public void run() {
      System.out.println("線程:" + Thread.currentThread().getName());
    }
  }
  
}

可以看到使用匿名內(nèi)部類的話就省略了新建Runnable接口的實(shí)現(xiàn)類這一步驟。

3. 使用Lambda表達(dá)式

上面使用匿名內(nèi)部類的寫法,如果使用Lambda表達(dá)式可以寫成下面這樣:

public class Test {
  public static void main(String[] args) {
    Thread t = new Thread(() ->  {
      System.out.println("線程:" + Thread.currentThread().getName());
    });
    t.start();
  }
}

這樣有一個(gè)問(wèn)題,如果接口里面有多個(gè)方法,那么Lambda表達(dá)式怎么知道實(shí)現(xiàn)的是哪個(gè)方法呢?我們通過(guò)代碼測(cè)試一下:

package com.wangjun.othersOfJava;

public class LambdaTest {

    public static void main(String[] args) {
        Animal a = () -> {  // 編譯報(bào)錯(cuò):The target type of this expression must be a functional interface
            System.out.println("狗狗吃飯");
        };
        a.eat();
    }
    interface Animal {
        public void eat();
        public void duty();
    }
}

可以看到編譯報(bào)錯(cuò),這個(gè)提到一個(gè)functional interface,就是函數(shù)式接口。函數(shù)式接口就是只有一個(gè)抽象方法的接口。這樣,就不難理解了,原來(lái)Lambda表達(dá)式只支持函數(shù)式接口。

4. Lambda表達(dá)式使用的幾種方式
package com.wangjun.othersOfJava;

public class LambdaTest {
    
    public static void main(String[] args) {
        
        // 帶類型
        Animal a1 = (String str) -> {
            System.out.println("狗狗吃飯:" + str);
        };
        // 不帶類型
        Animal a2 = (str) -> {
            System.out.println("狗狗吃飯:" + str);
        };
        // 不帶括號(hào)
        Animal a3 = str -> {
            System.out.println("狗狗吃飯:" + str);
        };
        // 不帶大括號(hào)
        Animal a4 = str -> System.out.println("狗狗吃飯:" + str);
        a1.eat("火腿腸");
        a2.eat("牛肉");
        a3.eat("面條");
        a4.eat("米飯");
        
        // 使用return返回
        Person p1 = () -> {
            return "老師的職責(zé):教書育人!";
        };
        // 直接返回
        Person p2 = () -> "醫(yī)生的職責(zé):救死扶傷!";
        System.out.println(p1.duty());
        System.out.println(p2.duty());
    }
    
    // 沒(méi)有返回值
    interface Animal {
        public void eat(String str);
    }
    // 有返回值
    interface Person {
        public String duty();
    }
}
5. Java的雙冒號(hào)表達(dá)式

JDK8中有雙冒號(hào)的用法,就是把方法當(dāng)做參數(shù)傳到stream內(nèi)部,使stream的每個(gè)元素都傳入到該方法里面執(zhí)行一下。下面通過(guò)遍歷一個(gè)List來(lái)說(shuō)明一下雙冒號(hào)和Lambda表達(dá)式使用方式的不同。

package com.wangjun.othersOfJava;

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

public class LambdaTest {
    
  public static void printStr(String str) {
    System.out.println(str);
  }

  public static void main(String[] args) {

    List list = Arrays.asList("aaa","bbb","ccc");
    // 1.通常的遍歷方式
    for(String str: list) {
      LambdaTest.printStr(str);
    }
    // 2.使用Lambda表達(dá)式遍歷
    list.forEach(str -> {
      LambdaTest.printStr(str);
    });
    // 3.使用::遍歷
    list.forEach(LambdaTest::printStr);
    // 下面的方法和上面等價(jià),使用的是函數(shù)式編程
    Consumer methodParam = LambdaTest::printStr; //方法參數(shù)
    list.forEach(x -> methodParam.accept(x));//方法執(zhí)行accept
  }
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71233.html

相關(guān)文章

  • 深入淺出 Java 8 Lambda 達(dá)式

    摘要:在支持一類函數(shù)的語(yǔ)言中,表達(dá)式的類型將是函數(shù)。匿名函數(shù)的返回類型與該主體表達(dá)式一致如果表達(dá)式的主體包含一條以上語(yǔ)句,則表達(dá)式必須包含在花括號(hào)中形成代碼塊。注意,使用表達(dá)式的方法不止一種。 摘要:此篇文章主要介紹 Java8 Lambda 表達(dá)式產(chǎn)生的背景和用法,以及 Lambda 表達(dá)式與匿名類的不同等。本文系 OneAPM 工程師編譯整理。 Java 是一流的面向?qū)ο笳Z(yǔ)言,除了部分簡(jiǎn)...

    wdzgege 評(píng)論0 收藏0
  • Java 8 Lambda 達(dá)式詳解

    摘要:表達(dá)式簡(jiǎn)介表達(dá)式是一個(gè)匿名函數(shù)對(duì)于而言并不很準(zhǔn)確,但這里我們不糾結(jié)這個(gè)問(wèn)題。如果表達(dá)式的正文有一條以上的語(yǔ)句必須包含在大括號(hào)代碼塊中,且表達(dá)式的返回值類型要與匿名函數(shù)的返回類型相同。 版權(quán)聲明:本文由吳仙杰創(chuàng)作整理,轉(zhuǎn)載請(qǐng)注明出處:https://segmentfault.com/a/1190000009186509 1. 引言 在 Java 8 以前,若我們想要把某些功能傳遞給某些方...

    haoguo 評(píng)論0 收藏0
  • 轉(zhuǎn) | Java8初體驗(yàn)(一)lambda達(dá)式語(yǔ)法

    摘要:初體驗(yàn)下面進(jìn)入本文的正題表達(dá)式。接下來(lái)展示表達(dá)式和其好基友的配合。吐槽一下方法引用表面上看起來(lái)方法引用和構(gòu)造器引用進(jìn)一步簡(jiǎn)化了表達(dá)式的書寫,但是個(gè)人覺(jué)得這方面沒(méi)有的下劃線語(yǔ)法更加通用。 感謝同事【天錦】的投稿。投稿請(qǐng)聯(lián)系 [email protected] 本文主要記錄自己學(xué)習(xí)Java8的歷程,方便大家一起探討和自己的備忘。因?yàn)楸救艘彩莿倓傞_(kāi)始學(xué)習(xí)Java8,所以文中肯定有錯(cuò)誤和理解偏...

    Lucky_Boy 評(píng)論0 收藏0
  • JAVA Lambda達(dá)式

    摘要:語(yǔ)言是強(qiáng)類型面向?qū)ο蟮恼Z(yǔ)言,所以必須提供一種數(shù)據(jù)類型作為表達(dá)式的返回值類型符合中函數(shù)格式的定義符合面向?qū)ο笠?guī)則,所以最終表達(dá)式要有一個(gè)映射成對(duì)象的過(guò)程。定一個(gè)函數(shù)式接口我們?cè)诮涌诶锒x了一個(gè)沒(méi)有參數(shù)返回值的抽象方法。 在JAVA中,Lambda 表達(dá)式(Lambda expression)是一個(gè)抽象方法的實(shí)現(xiàn)。這個(gè)抽象方法必須是在接口中聲明的,而且實(shí)現(xiàn)類只需要實(shí)現(xiàn)這一個(gè)抽象方法,我們稱...

    Cheng_Gang 評(píng)論0 收藏0
  • Java Lambda達(dá)式

    摘要:表達(dá)式的主要作用就是代替匿名內(nèi)部類的煩瑣語(yǔ)法。從這點(diǎn)來(lái)看,表達(dá)式的代碼塊與匿名內(nèi)部類的方法體是相同的。與匿名內(nèi)部類相似的是,由于表達(dá)式訪問(wèn)了局部變量,該局部變量相當(dāng)于與一個(gè)隱式的修飾,因此不允許對(duì)局部變量重新賦值。 函數(shù)式接口 函數(shù)式接口(Functional Interface)就是一個(gè)只有一個(gè)抽象方法(可以包含多個(gè)默認(rèn)方法或多個(gè)static方法)的普通接口,可以被隱式轉(zhuǎn)換為lamb...

    lewif 評(píng)論0 收藏0
  • Java Lambda 達(dá)式(又名閉包 (Closure)/ 匿名函數(shù) ) 筆記

    摘要:表達(dá)式又名閉包匿名函數(shù)筆記根據(jù)終于在中引入了表達(dá)式。函數(shù)式接口要介紹中表達(dá)式的實(shí)現(xiàn),需要知道什么是函數(shù)式接口。但同樣需要保證外部的自由變量不能在表達(dá)式中被改變。 Java Lambda 表達(dá)式(又名閉包 (Closure)/ 匿名函數(shù) ) 筆記 根據(jù) JSR 335, Java 終于在 Java 8 中引入了 Lambda 表達(dá)式。也稱之為閉包或者匿名函數(shù)。 showImg(https...

    fou7 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

周國(guó)輝

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<