<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

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

    共 5757字,需瀏覽 12分鐘

     ·

    2022-06-12 22:54


    Lambda表達(dá)式介紹

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

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

    Lambda表達(dá)式語法

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

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

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

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

    到目前為止,我們對Lambda表達(dá)式有了基本的認(rèn)識,下面用幾個簡單的例子來讓我們好好理解一下Lambda表達(dá)式的使用,看看Lambda是怎樣簡化了函數(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ù)式接口的定義:只允許有一個抽象方法的接口,那么它就是一個函數(shù)式接口。針對函數(shù)式接口,官方給我們提供了一個注解@FunctionalInterface,該注解會檢查它是否是一個函數(shù)式接口,所以如果我們需要自定義一個函數(shù)式接口的話,可以在接口類的上方聲明@FunctionalInterface。

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

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

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

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

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

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

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

    四大類型接口

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

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

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

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

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

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

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

    /**
     * 內(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)贊
    評論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報
    評論
    圖片
    表情
    推薦
    點(diǎn)贊
    評論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    欧美综合在线视频 | 亚洲免费观看高清在线观看 | 大香蕉伊人免费看 | 欧美成人AU在线 | 久久白丝 |