91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java8 之 lambda 表達式、方法引用、函數式接口、默認方式、靜態方法

發布時間:2020-07-30 21:23:25 來源:網絡 閱讀:350 作者:歐陽思海 欄目:編程語言

今天我來聊聊 Java8 的一些新的特性,確實 Java8 的新特性的出現,給開發者帶來了非常大的便利,可能剛剛開始的時候會有點不習慣的這種寫法,但是,當你真正的熟悉了之后,你一定會愛上這些新的特性的,這篇文章就來聊聊這些新特性。

lambda 表達式

lambda 表達式在項目中也是用到了,這種新的語法的加入,對于使用 Java 多年的我,我覺得是如虎添翼的感覺哈,這種新的語法,大大的改善了以前的 Java 的代碼,變得更加的簡潔,我覺得這也是為什么 Java8 能夠很快的流行起來的原因吧。

這里我們用幾個以前的經典的 Java 的寫法和用 lambda 表達式的方式進行對比。

線程的用法

原始的線程用法

//使用匿名內部類的方式啟動多線程
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("這是使用匿名內部類的方式。。。");
            }
        }).start();

lambda 表達式

//使用lambda表達式方式
        new Thread(() -> {
            System.out.println("這是使用lambda表達式的方式。。。");
        }).start();

你會發現,用 lambda 表達式的方式能夠寫更少的代碼,看起來也會更加的舒服和簡潔。

這里沒有使用參數,只是一個簡單的例子。

我們再看一個例子。

遍歷方式

原始方式

//原始方式
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        for (int i : list) {
            System.out.println(i);
        }

lambda 表達式方式

//使用lambda表達式代替foreach循環
        Stream.of(1, 2, 3, 4, 5).forEach((x) -> {
            System.out.println(x);
        });

在原始的方式中,我們一般使用 foreach 的方式進行遍歷,有了 Java8 的方式之后,我們可以用 forEach 方法,然后,再用 lambda 表達式的方式進行遍歷,也讓原來的方式變得更加的簡潔。

在這個例子中,我們加了一個參數,在()中間我們加了一個 x ,代表的意思其實是:通過 forEach 方法,我們把一個元素已經賦值到 x 中了,拿到這個 x ,我們就可以輸出結果。

總結

lambda 的使用方式其實很簡單,可以總結為下面的方法。

([參數可選,...]) -> {
}

方法引用

方法引用其實是 lambda 表達式的部分的簡化,也就是為了簡化 lambda 表達式而存在的感覺,下面我們還講講怎么使用方法引用

/**
     * @return void
     * @Author ouyangsihai
     * @Description 方法引用測試
     * @Date 10:23 2019/5/14
     * @Param []
     **/
    @Test
    public void test_method_reference() {
        //使用lambda表達式
        Stream.of("A", "BB", "CCC", "DDDD", "FFFFF")
                .map(s -> s.length()) //lambda
                .forEach((x) -> {
                    System.out.println(x);
                });

        //使用靜態方法引用
        Stream.of("A", "BB", "CCC", "DDDD", "FFFFF")
                .map(String::length) //靜態方法引用
                .forEach((x) -> {
                    System.out.println(x);
                });

        //使用實例方法引用
        Stream.of(
                new ClassMate("1", "歐陽思海"),
                new ClassMate("2", "sihai")
        ).map(ClassMate::getName)//實例方法引用
                .forEach(x -> {
                    System.out.println(x);
                });

    }

在第一個測試中,我們用的是 lambda 表達式來獲取每個字符串的長度

s -> s.length()

在第二個測試中,我們使用的是靜態方法引用來獲取每個字符串的長度

String::length

在第三個測試中,我們使用的是實例方法引用。

ClassMate::getName

解釋
① map 方法是映射的意思。
② forEach 方式是遍歷每一個元素。
③ ClassMate 是一個包含 id 和 name 的簡單 po 類。

通過上面這個例子,基本上我們就知道怎么使用方法引用了。下面我們進行一個小的總結。

總結
① 使用方法

類名::方法名

② 方法可以是:靜態方法,實例方法

構造函數引用

在上面我們講了方法引用的基本使用方法,其實除了方法引用以外,還有構造函數引用,回想一下,以前我們創建對象是怎么做?是不是需要 new 一個對象呢,那么現在用構造函數引用又是怎么做的呢?

下面我們用一個例子講解一下,在這個例子中,對象還是使用上面的 ClassMate

/**
     * @return void
     * @Author ouyangsihai
     * @Description 構造函數引用測試
     * @Date 10:23 2019/5/14
     * @Param []
     **/
    @Test
    public void test_method_reference2() {
        //使用lambda表達式
        Stream.of("A", "BB", "CCC", "DDDD", "FFFFF")
                .map(s -> new ClassMate(s)) //lambda
                .collect(Collectors.toList());

        //使用構造函數引用
        Stream.of("A", "BB", "CCC", "DDDD", "FFFFF")
                .map(ClassMate::new) //構造函數引用,由上下文決定用哪一個構造函數
                .collect(Collectors.toList());
    }

① 第一個我們使用的是 lambda 表達式進行創建對象的 s -&gt; new ClassMate(s)
② 第二個我們使用的是構造函數引用創建對象的 ClassMate::new
③ 我們發現構造函數引用:類名::new ,然后對于使用哪一個構造函數是由上下文決定的,比如有一個參數和兩個參數和無參數的構造函數,會自動確定用哪一個。

接口

在 Java 8 之前的接口是不能有實現的,只能定義抽象方法,然而,在 Java 8 以后,增加了一個新的功能,可以添加實現,可以定義默認方法,可以定義靜態方法

函數式接口

什么是函數式接口呢?

這個名詞在 Java 中以前是很少聽到的,但是正是有了 Java 8 的橫空出世,函數式編程也變得熟悉了。

在一個接口中我們以 @FunctionalInterface 注解聲明一個接口,并且接口中只有一個抽象方法,那么我們就叫做這是一個函數式接口

/**
 * @ClassName FunctionalInterfaceTest
 * @Description
 * @Author 歐陽思海
 * @Date 2019/5/14 10:39
 * @Version 1.0
 **/
@FunctionalInterface
public interface FunctionalInterfaceTest {
    //繼承接口后,又加了新的抽象方法,這個接口就不再是函數式接口
    void test(String s);
}

① 上面的接口中只有一個抽象方法,所以這是一個函數式接口。
② 如果上面接口中再加一個抽象方法,那么就不是函數式接口了。

下面,我們再通過繼承來繼承這個接口。

/**
 * @ClassName FunctionalTest
 * @Description
 * @Author 歐陽思海
 * @Date 2019/5/17 17:26
 * @Version 1.0
 **/
public interface FunctionalTest extends FunctionalInterfaceTest{

    int test2();
}

① 我們繼承了上面的接口,并且加了一個 test2 方法。
② 這里注意,如果一個接口集成現有的函數式接口后,又加了其他的抽象方法,這個接口就不是函數式接口了。

默認方法

默認方法很簡單,用 default 聲明即可。

/**
 * @ClassName FunctionalInterfaceTest
 * @Description
 * @Author 歐陽思海
 * @Date 2019/5/14 10:39
 * @Version 1.0
 **/
@FunctionalInterface
public interface FunctionalInterfaceTest {
    //繼承接口后,又加了新的抽象方法,這個接口就不再是函數式接口
    void test(String s);

    //默認方法
    default String getStr(){
        return null;
    }
}

① 在接口中添加了一個默認方法。并且實現了方法。

靜態方法

默認方法很簡單,用 static 聲明即可。

/**
 * @ClassName FunctionalInterfaceTest
 * @Description
 * @Author 歐陽思海
 * @Date 2019/5/14 10:39
 * @Version 1.0
 **/
@FunctionalInterface
public interface FunctionalInterfaceTest {
    //繼承接口后,又加了新的抽象方法,這個接口就不再是函數式接口
    void test(String s);

    //靜態方法
    static String getStr2(){
        return null;
    }

    //錯誤用法
    default static String getStr3(){
        return null;
    }
}

① 實現的靜態方法,用 static 聲明。
② 注意不能同時使用 default 和 static 聲明。

總結

在這篇文章中,我們講了 lambda 表達式、方法引用、函數式接口、接口中的靜態方法、接口中的默認方法的使用。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南川市| 浦江县| 石首市| 阜城县| 洛阳市| 察哈| 廉江市| 新郑市| 鸡泽县| 河间市| 临西县| 黎川县| 五指山市| 红河县| 高淳县| 始兴县| 香港| 阳山县| 德清县| 桑植县| 长阳| 阿巴嘎旗| 法库县| 乐陵市| 长葛市| 利川市| 惠东县| 遂昌县| 棋牌| 八宿县| 依兰县| 岳西县| 东宁县| 平和县| 科技| 富川| 钟山县| 浠水县| 出国| 镇江市| 深水埗区|