<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【java基礎(chǔ)】Lambda表達(dá)式

          共 5757字,需瀏覽 12分鐘

           ·

          2022-06-12 22:54


          Lambda表達(dá)式介紹

          Java支持Lambda 表達(dá)式始于Java 8,它的出現(xiàn)簡(jiǎn)化了函數(shù)式接口匿名內(nèi)部類的語(yǔ)法。使用Lambda表達(dá)式可以讓我們的代碼更少,看上去更簡(jiǎn)潔,代碼更加靈活。但也有它的缺點(diǎn)所在,如果Lambda表達(dá)式用的不好的話,調(diào)試運(yùn)行和后期維護(hù)比較麻煩。

          Lambda只能接受函數(shù)式接口,所謂的函數(shù)式接口指的是只能有一個(gè)抽象方法的接口。

          Lambda表達(dá)式語(yǔ)法

          Lambda表達(dá)式通過(guò)操作符->分為兩個(gè)部分:

          • ? 左側(cè):指定了Lambda表達(dá)式所需要的所有參數(shù)。

          • 右側(cè)指定了Lambda體,即Lambda表達(dá)式所要執(zhí)行的功能。

          Lambda表達(dá)式的基本語(yǔ)法結(jié)構(gòu)如下,當(dāng)然,這里只是簡(jiǎn)單的Lambda 表達(dá)式的應(yīng)用。

          到目前為止,我們對(duì)Lambda表達(dá)式有了基本的認(rèn)識(shí),下面用幾個(gè)簡(jiǎn)單的例子來(lái)讓我們好好理解一下Lambda表達(dá)式的使用,看看Lambda是怎樣簡(jiǎn)化了函數(shù)式接口匿名內(nèi)部類的。

          public class LambdaExample {
              public static void main(String[] args) {
                  //普通寫法(匿名內(nèi)部類)
                  Thread thread = new Thread(new Runnable() {
                      @Override
                      public void run() {
                          System.out.println("Ordinary Writing");
                      }
                  });
                  thread.start();

                  //Lambda寫法。無(wú)參無(wú)返回void
                  Thread thread1 = new Thread(() -> System.out.println("Lambda Writing"));
                  thread1.start();
              }
          }

          ******************【運(yùn)行結(jié)果】******************
          Ordinary Writing
          Lambda Writing

          函數(shù)式接口

          前面講了使用Lambda表達(dá)式的前提是函數(shù)式接口,所以接下來(lái)學(xué)習(xí)一下函數(shù)式接口。

          函數(shù)式接口介紹

          函數(shù)式接口的定義:只允許有一個(gè)抽象方法的接口,那么它就是一個(gè)函數(shù)式接口。針對(duì)函數(shù)式接口,官方給我們提供了一個(gè)注解@FunctionalInterface,該注解會(huì)檢查它是否是一個(gè)函數(shù)式接口,所以如果我們需要自定義一個(gè)函數(shù)式接口的話,可以在接口類的上方聲明@FunctionalInterface。

          需要注意的是,數(shù)式接口雖然規(guī)定只能有一個(gè)抽象方法,但是同時(shí)可以有多個(gè)非抽象方法(如靜態(tài)方法,默認(rèn)方法,私有方法)。下面是一個(gè)自定義的函數(shù)式接口:

          @FunctionalInterface
          public interface FunctionalInterface {
              /**
               * 抽象方法(只能有一個(gè))
               */

              void method();
              //void method1();再定義一個(gè)會(huì)提示:找到多個(gè)抽象方法

              /**
               * 默認(rèn)方法,必須用default修飾
               */

              default void defaultMethod() {
                  System.out.println("默認(rèn)方法...");
              }

              /**
               * 靜態(tài)方法方法
               */

              static void staticMethod() {
                  System.out.println("靜態(tài)方法...");
              }
          }

          四大類型接口

          Java8中增加了一個(gè)包:java.util.function。它們里面包含了常用的函數(shù)式接口,該包下定義的函數(shù)式接口非常多,主要有四大類:

          可以看出四種函數(shù)式接口抽象方法的特點(diǎn)如下:

          • ? 消費(fèi)型接口:有參數(shù)傳入,無(wú)結(jié)果返回。

          • ? 供給型接口:無(wú)參數(shù)傳入,但是有返回值

          • ? 判斷型接口:有參傳入,但是返回值類型是boolean結(jié)果。

          • ? 功能型接口:既有參數(shù)傳入又有結(jié)果值返回

          四種函數(shù)式接口用法簡(jiǎn)單舉例如下:

          /**
           * 內(nèi)置最常用的四種函數(shù)式接口
           */

          class FunctionalnterfaceTest{
              //消費(fèi)型接口
              public void test0(){
                  Consumer<String> consumer = s -> System.out.println("[Consumer<T>]--->" + s);
                  consumer.accept("hello");
              }

              //供給型接口
              public void test1() {
                  Supplier<String> supplier = () ->  "hello";
                  System.out.println("[Supplier<T>]--->" + supplier.get());
              }

              //判斷型接口
              public void test2() {
                  Predicate<String> predicate = s -> s.equals("hello");
                  System.out.println("[Predicate<T>]--->" + predicate.test("hello"));
              }

              //功能性接口
              public void test3() {
                  Function<String, String> function = (s) -> {
                      return "hello" + s;
                  };
                  System.out.println("[Function<T, R>]--->" + function.apply("666"));
              }
          }

          public class FunctionalnterfaceExample {
              public static void main(String[] args) {
                  FunctionalnterfaceTest functionalnterfaceTest = new FunctionalnterfaceTest();
                  functionalnterfaceTest.test0();
                  functionalnterfaceTest.test1();
                  functionalnterfaceTest.test2();
                  functionalnterfaceTest.test3();
              }
          }

          ******************【運(yùn)行結(jié)果】******************
          [Consumer<T>]--->hello
          [Supplier<T>]--->hello
          [Predicate<T>]--->true
          [Function<T, R>]--->hello666

          其實(shí),這四種函數(shù)式接口每種都有其變種形式,如消費(fèi)型接口有如下幾種形式:


          不過(guò)盡管形式很多,但是用法其實(shí)和最基本的用法差不多,這里就不一一介紹了。

          本文源碼地址:
          https://github.com/qinlizhong1/javaStudy/tree/master/javaExample/src/main/java/java8

          本文示例代碼環(huán)境:
          操作系統(tǒng):macOs 12.1
          JDK版本:12.0.1
          maven版本: 3.8.4

          ??掃描上方二維碼關(guān)注

          瀏覽 57
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲天堂一区二区三区 | 小黄片在线免费看 | 中文字幕一级毛片 | 99精品美国 | 上床视频免费网站 |