Java語言高級篇之jdk8新特性(一)

Java 8 (又稱爲 jdk 1.8) 是 Java 語言開發的一個主要版本。 Java 8 是oracle公司於2014年3月發佈,能夠當作是自Java 5 以 來最具革命性的版本。Java 8爲Java語言、編譯器、類庫、開發 工具與JVM帶來了大量新特性。java

此次先簡要的說一下其特性和其主要特色,後續再針對一些重要的特性繼續加以代碼進行詳情更新。oracle

jdk8的新特性有:

  • 函數式接口
  • Lambda表達式
  • 方法引用/構造器引用
  • 更強的Strean API
  • 接口的加強
  • Optional
  • 新的時間和日期API
  • 其它新特性,如註解中的重複註解、類型註解,HashMap底層的變化,JVM中Metaspace取代PermGen空間等

新特性特色:

  • 速度更快
  • 代碼更少(增長了新的語法:Lambda 表達式)
  • 強大的 Stream API
  • 便於並行
  • 最大化減小空指針異常:Optional
  • Nashorn引擎,容許在JVM上運行JS應用

接下來先介紹函數式接口和Lambda表達式(由於Lambda表達式中要用到函數式接口,因此先介紹函數式接口)。ide

什麼是函數式接口?

若是一個接口中,只聲明瞭一個抽象方法,則此接口就稱爲函數式接口。
能夠經過 Lambda 表達式來建立該接口的對象。(若Lambda 表達式 拋出一個受檢異常(即:非運行時異常),那麼該異常須要在目標接口的抽 象方法上進行聲明)。
咱們能夠在一個接口上使用 @FunctionalInterface 註解,這樣作能夠檢 查它是不是一個函數式接口。同時 javadoc 也會包含一條聲明,說明這個 接口是一個函數式接口。
java.util.function包下定義了Java 8 的豐富的函數式接口函數

Jdk8中關於Lambda表達式提供的4個基本的函數式接口:

四大函數式接口.PNG
代碼體現:(消費型函數釋接口)工具

@Test//消費型接口spa

public void test1(){

    //消費型接口:(常規實現)
    unforgettableTime(6000, new Consumer<Double>() {
        @Override
        public void accept(Double aDouble) {
            System.out.println("2020年等疫情結束後要好好珍惜熱愛生活,準備出去旅行,預計花費:" + aDouble);
        }
    });

    System.out.println("********************");
    //Lambda實現消費型接口:
    unforgettableTime(9999,money -> System.out.println("醫護人員太辛苦了,冒着生命危險去死神手裏搶救同胞,應該象徵性的獎勵:" + money));
}

public void unforgettableTime(double money, Consumer<Double> con){
    con.accept(money);
}

結果截圖:
image.png指針

代碼體現:判定型接口code

@Test//判定型接口:過濾字符中含有「京」的字符串
    public void test2(){
        List<String> list = Arrays.asList("北京","南京","天津","東京","西京","普京");
    //(常規實現)
        List<String> filterStrs = filterString(list, new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.contains("京");
            }
        });

        System.out.println(filterStrs);
        //Lambda實現判定型接口:
        List<String> filterStrs1 = filterString(list, s -> s.contains("京"));
        System.out.println(filterStrs1);
    }

    //根據給定的規則,過濾集合中的字符串。此規則由Predicate的方法決定
    public List<String> filterString(List<String> list, Predicate<String> pre){

        ArrayList<String> filterList = new ArrayList<>();

        for(String s : list){
            if(pre.test(s)){
                filterList.add(s);
            }
        }

        return filterList;

    }

結果截圖
image.png對象

什麼是Lambda表達式,爲何使用它

Lambda 是一個匿名函數,咱們能夠把 Lambda 表達式理解爲是一段能夠
傳遞的代碼(將代碼像數據同樣進行傳遞)。使用它能夠寫出更簡潔、更 靈活的代碼。做爲一種更緊湊的代碼風格,使Java的語言表達能力獲得了
提高
Lambda 表達式:在Java 8 語言中引入的一種新的語法元素和操 做符。這個操做符爲 「->」 , 該操做符被稱爲 Lambda 操做符 或箭頭操做符。它將 Lambda 分爲兩個部分:
左側:指定了 Lambda 表達式須要的參數列表 右側:指定了 Lambda 體,是抽象方法的實現邏輯,也即 Lambda 表達式要執行的功能
例如:blog

1.舉例: (o1,o2) -> Integer.compare(o1,o2);
2.格式:
  -> :lambda操做符 或 箭頭操做符
 ->左邊:lambda形參列表 (其實就是接口中的抽象方法的形參列表)
 ->右邊:lambda體 (其實就是重寫的抽象方法的方法體)

可能看定義比較抽象,下面用具體例子來體會一二Lambda表達式使用先後的對比:

代碼體現:

@Test
    public void test1(){

        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("少年強則中國強");
            }
        };

        r1.run();

        System.out.println("***常規實如今上*****Lambda實如今下****");

        Runnable r2 =() -> System.out.println("2020年中華民族經過抗疫再次向世界證實咱們是團結的一家人");
        r2.run();
    }

結果以下:
image.png
代碼體現:Comparetor接口的使用

@Test
    public void test2(){

        Comparator<Integer> com1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1,o2);
            }
        };

        int compare1 = com1.compare(12,21);
        System.out.println(compare1);

        System.out.println("***常規實如今上*****Lambda實如今下****
");
        //Lambda表達式的寫法
        Comparator<Integer> com2 = (o1, o2) -> Integer.compare(o1,o2);

        int compare2 = com2.compare(32,21);
        System.out.println(compare2);
        }

結果截圖:
image.png

這篇的介紹就先到這,下一篇總結一下Lambda表達式的六種使用狀況。

相關文章
相關標籤/搜索