1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        【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)部類的語法。使用Lambda表達(dá)式可以讓我們的代碼更少,看上去更簡(jiǎn)潔,代碼更加靈活。但也有它的缺點(diǎn)所在,如果Lambda表達(dá)式用的不好的話,調(diào)試運(yùn)行和后期維護(hù)比較麻煩。

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

        Lambda表達(dá)式語法

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

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

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

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

        到目前為止,我們對(duì)Lambda表達(dá)式有了基本的認(rèn)識(shí),下面用幾個(gè)簡(jiǎn)單的例子來讓我們好好理解一下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寫法。無參無返回void
                Thread thread1 = new Thread(() -> System.out.println("Lambda Writing"));
                thread1.start();
            }
        }

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

        函數(shù)式接口

        前面講了使用Lambda表達(dá)式的前提是函數(shù)式接口,所以接下來學(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ù)傳入,無結(jié)果返回。

        • ? 供給型接口:無參數(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)型接口有如下幾種形式:


        不過盡管形式很多,但是用法其實(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)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            50岁女人叫床叫高潮惨 | 少妇的逼| 欧美色图片区 | 日本三级hd | 欧美草逼视频 | 日韩精品一区二区三区四虎视频 | 成人无码A片在线观看爆乳 | 国产欧美日韩专区 | 成人秘 高潮片免费视频在线观看 | 中国免费黄色 |