Java 8 (又稱爲 jdk 1.8) 是 Java 語言開發的一個主要版本。 Java 8 是oracle公司於2014年3月發佈,能夠當作是自Java 5 以 來最具革命性的版本。Java 8爲Java語言、編譯器、類庫、開發 工具與JVM帶來了大量新特性。java
此次先簡要的說一下其特性和其主要特色,後續再針對一些重要的特性繼續加以代碼進行詳情更新。oracle
接下來先介紹函數式接口和Lambda表達式(由於Lambda表達式中要用到函數式接口,因此先介紹函數式接口)。ide
若是一個接口中,只聲明瞭一個抽象方法,則此接口就稱爲函數式接口。
能夠經過 Lambda 表達式來建立該接口的對象。(若Lambda 表達式 拋出一個受檢異常(即:非運行時異常),那麼該異常須要在目標接口的抽 象方法上進行聲明)。
咱們能夠在一個接口上使用 @FunctionalInterface 註解,這樣作能夠檢 查它是不是一個函數式接口。同時 javadoc 也會包含一條聲明,說明這個 接口是一個函數式接口。
在java.util.function包下定義了Java 8 的豐富的函數式接口函數
代碼體現:(消費型函數釋接口)工具
@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); }
結果截圖:
指針
代碼體現:判定型接口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; }
結果截圖
對象
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(); }
結果以下:
代碼體現: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); }
結果截圖:
這篇的介紹就先到這,下一篇總結一下Lambda表達式的六種使用狀況。