溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何掌握J(rèn)ava8中Lambda表達(dá)式函數(shù)式接口及方法構(gòu)造器數(shù)組的引用

發(fā)布時(shí)間:2021-10-08 13:46:37 來(lái)源:億速云 閱讀:156 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容主要講解“如何掌握J(rèn)ava8中Lambda表達(dá)式函數(shù)式接口及方法構(gòu)造器數(shù)組的引用”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何掌握J(rèn)ava8中Lambda表達(dá)式函數(shù)式接口及方法構(gòu)造器數(shù)組的引用”吧!

目錄
  • 函數(shù)式接口概述

  • 函數(shù)式接口示例

    • 1、Runnable接口

    • 2、自定義函數(shù)式接口

    • 3、作為參數(shù)傳遞 Lambda 表達(dá)式

  • 內(nèi)置函數(shù)式接口

    • Lambda簡(jiǎn)述

      • Lambda語(yǔ)法

        • 方法引用

          • 構(gòu)造器引用

            • 數(shù)組引用

              函數(shù)式接口概述

              只包含一個(gè)抽象方法的接口,稱(chēng)為函數(shù)式接口。

              可以通過(guò) Lambda 表達(dá)式來(lái)創(chuàng)建該接口的對(duì)象。

              可以在一個(gè)接口上使用 @FunctionalInterface 注解,這樣做可以檢查它是否是一個(gè)函數(shù)式接口。同時(shí) javadoc 也會(huì)包含一條聲明,說(shuō)明這個(gè)接口是一個(gè)函數(shù)式接口。

              在java.util.function包下定義了Java 8 的豐富的函數(shù)式接口。

              在函數(shù)式編程語(yǔ)言當(dāng)中,函數(shù)被當(dāng)做一等公民對(duì)待。在將函數(shù)作為一等公民的編程語(yǔ)言中,Lambda表達(dá)式的類(lèi)型是函數(shù)。但是在Java8中,有所不同。在Java8中,Lambda表達(dá)式是對(duì)象,而不是函數(shù),它們必須依附于一類(lèi)特別的對(duì)象類(lèi)型——函數(shù)式接口。

              簡(jiǎn)單的說(shuō),在Java8中,Lambda表達(dá)式就是一個(gè)函數(shù)式接口的實(shí)例。這就是Lambda表達(dá)式和函數(shù)式接口的關(guān)系。也就是說(shuō),只要一個(gè)對(duì)象是函數(shù)式接口的實(shí)例,那么該對(duì)象就可以用Lambda表達(dá)式來(lái)表示。所以用匿名實(shí)現(xiàn)類(lèi)表示的現(xiàn)在都可以用Lambda表達(dá)式來(lái)寫(xiě)。

              函數(shù)式接口示例

              1、Runnable接口

              2、自定義函數(shù)式接口

              @FunctionalInterface
              public interface MyFunctional01{
                  public String getValue();
              }
              
              //使用泛型
              @FunctionalInterface
              public interface MyFunctional02<T>{
                  public T getValue(T t);
              }

              3、作為參數(shù)傳遞 Lambda 表達(dá)式

              public class LambdaTest {
                  public static void main(String[] args) {
                      String newStr = toUpperString(str -> str.toUpperCase(),"abcDEf");
                      System.out.println(newStr);
                  }
                  public static String toUpperString(MyFunc<String> my,String str){
                      return my.getValue(str);
                  }
              }
              
              @FunctionalInterface
              interface MyFunc<T>{
                  public T getValue(T t);
              }

              內(nèi)置函數(shù)式接口

              import java.util.function.Consumer;
              
              /**
               * @Author: Yeman
               * @Date: 2021-10-03-22:50
               * @Description:
               */
              public class LambdaTest {
                  public static void main(String[] args) {
                      Consumer<Integer> consumer = i -> System.out.println(i);
                      consumer.accept(9);
                  }
              }

              如何掌握J(rèn)ava8中Lambda表達(dá)式函數(shù)式接口及方法構(gòu)造器數(shù)組的引用

              Lambda簡(jiǎn)述

              Lambda 是一個(gè)匿名函數(shù),我們可以把 Lambda 表達(dá)式理解為是一段可以傳遞的代碼(將代碼像數(shù)據(jù)一樣進(jìn)行傳遞)。使用它可以寫(xiě)出更簡(jiǎn)潔、更靈活的代碼。作為一種更緊湊的代碼風(fēng)格,使Java的語(yǔ)言表達(dá)能力得到了提升。

              其本質(zhì)是作為函數(shù)式接口(只有一個(gè)抽象方法)的實(shí)例。

              Lambda 表達(dá)式:在Java 8 語(yǔ)言中引入的一種新的語(yǔ)法元素和操作符。這個(gè)操作符為 “->” , 該操作符被稱(chēng)為 Lambda 操作符或箭頭操作符。它將 Lambda 分為兩個(gè)部分:
              ①左側(cè):指定了 Lambda 表達(dá)式需要的參數(shù)列表。
              ②右側(cè):指定了 Lambda 體,是抽象方法的方法體。

              Lambda語(yǔ)法

              1、無(wú)參,無(wú)返回值

              public class LambdaTest {
                  public static void main(String[] args) {
                      //未使用Lambda表達(dá)式
                      Runnable runnable1 = new Runnable() {
                          @Override
                          public void run() {
                              System.out.println("這是第一個(gè)語(yǔ)法!");
                          }
                      };
                      runnable1.run();
                      System.out.println("======================");
                      //使用Lambda表達(dá)式
                      Runnable runnable2 = () -> {
                          System.out.println("這是用了Lambda表達(dá)式的一個(gè)語(yǔ)法!");
                      };
                      runnable2.run();
                  }
              }

              2、一個(gè)參數(shù),無(wú)返回值


              3、數(shù)據(jù)類(lèi)型可以省略,因?yàn)榭捎删幾g器推斷得出,稱(chēng)為“類(lèi)型推斷”


              4、Lambda 若只需要一個(gè)參數(shù)時(shí),參數(shù)的小括號(hào)可以省略


              5、Lambda 需要兩個(gè)或以上的參數(shù),多條執(zhí)行語(yǔ)句,并且可以有返回值


              6、當(dāng) Lambda 體只有一條語(yǔ)句時(shí),return 與大括號(hào)若有,都可以省略

              方法引用

              當(dāng)要傳遞給Lambda體的操作,已經(jīng)有實(shí)現(xiàn)的方法了,可以使用方法引用。

              方法引用可以看做是Lambda表達(dá)式深層次的表達(dá)。換句話(huà)說(shuō),方法引用就是Lambda表達(dá)式,也就是函數(shù)式接口的一個(gè)實(shí)例,通過(guò)方法的名字來(lái)指向一個(gè)方法,可以認(rèn)為是Lambda表達(dá)式的一個(gè)語(yǔ)法糖。

              要求:實(shí)現(xiàn)接口的抽象方法的參數(shù)列表和返回值類(lèi)型,必須與方法引用的方法的參數(shù)列表和返回值類(lèi)型保持一致。

              格式:使用操作符 “::” 將類(lèi)(或?qū)ο?與方法名分隔開(kāi)。

              如下三種主要使用情況:
              對(duì)象::非靜態(tài)方法名
              類(lèi)::靜態(tài)方法名
              類(lèi)::非靜態(tài)方法名

              示例:

              import java.util.Comparator;
              import java.util.function.Consumer;
              
              /**
               * @Author: Yeman
               * @Date: 2021-10-03-22:50
               * @Description:
               */
              public class LambdaTest {
                  public static void main(String[] args) {
              
                      Consumer<Integer> consumer = i -> System.out.println(i);
                      consumer.accept(9);
              
                      Consumer<String> stringConsumer = System.out :: println;
                      stringConsumer.accept("Hello");
              
                      Comparator<Integer> comparable = (x, y) -> Integer.compare(x,y);
                      System.out.println(comparable.compare(2,9));
              
                      Comparator<Integer> integerComparator = Integer :: compare;
                      System.out.println(integerComparator.compare(9,2));
                  }
              }

              構(gòu)造器引用

              格式:ClassName::new

              與函數(shù)式接口相結(jié)合,自動(dòng)與函數(shù)式接口中方法兼容??梢园褬?gòu)造器引用賦值給定義的方法,要求構(gòu)造器參數(shù)列表要與接口中抽象方法的參數(shù)列表一致,且方法的返回值即為構(gòu)造器對(duì)應(yīng)類(lèi)的對(duì)象。

              數(shù)組引用

              可以將數(shù)組看作一個(gè)類(lèi),則數(shù)組引用就類(lèi)似于構(gòu)造器引用。

              格式:type[] :: new

              import java.util.function.Function;
              
              /**
               * @Author: Yeman
               * @Date: 2021-10-03-22:50
               * @Description:
               */
              public class LambdaTest {
                  public static void main(String[] args) {
                      Function<Integer,String[]> function = length -> new String[length];
                      String[] apply = function.apply(3);
                      System.out.println(apply[2]);
              
                      System.out.println("================");
              
                      Function<Integer,String[]> function1 = String[] :: new;
                      System.out.println(function1.apply(5));
                  }
              }

              到此,相信大家對(duì)“如何掌握J(rèn)ava8中Lambda表達(dá)式函數(shù)式接口及方法構(gòu)造器數(shù)組的引用”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

              向AI問(wèn)一下細(xì)節(jié)

              免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

              AI