今天在別人代碼中發現java8 新特性,發現本身閱讀代碼有點兒吃力,非常汗顏,java8新特性都出來這麼久了,只知其名不見其形,全部今天回家補了補知識。java
1、 接口sql
在java8 中,接口中引入了新的關鍵字default和static,經過使用default修飾方法,可讓咱們在接口中定義具體的方法實現,也可以使用static關鍵字來定義接口方法。express
public interface InterClass { String test1(String str); default String test2(String str){ return "test2:" + str; } static String test3(String str){ return "test3:" + str; } }
2、Lamdba表達式編程
Lambda表達式的語法格式以下:數組
(params) -> expression 或 (params) -> {statements;}
Lambda(蘭布達)表達式,是推進Java 8 發佈的最重要的新特性,這意味着Java也開始認可了函數式編程。函數式編程的一個特色就是容許把函數自己做爲參數傳入另外一個函數,還容許返回一個函數。使用Lambda表達式可使代碼變的更加簡潔緊湊。app
下面代碼解釋了什麼是函數式接口編程:函數式編程
/** * 函數式接口 * 函數式接口是值僅僅只包含一個抽象方法的接口(能夠有多個default和static方法), * 每個Lambda表達式都會匹配到這個方法。 * jdk1.8 提供了 註解@FunctionalInterface來定義函數式接口 */ @FunctionalInterface public interface FunInterface { String test1(String str); /**若是包含多個抽象接口,編譯器會報錯 * 如在定義一個抽象方法 String test2(String str); * 可是能夠定義任意多個的 default方法和 static方法 */ default String test3(String str){ return "test3:" + str; } default String test4(String str){ return "test4:" + str; } static String test5(String str){ return "test5:" + str; } static String test6(String str){ return "test6:" + str; } }
測試:函數
public static void main(String args[]) { FunInterface funInterface = str -> "這是一個Lambda表達式"; System.out.println(funInterface.test1("")); System.out.println(funInterface.test3("調用default方法")); System.out.println(FunInterface.test5("調用static方法")); }
Lambda表達式的重要特徵:測試
Lambda表達式的變量做用域:this
3、方法引用
Jdk1.8 提供了另外一種調用方式一對冒號( :: ),當你須要使用方法引用時,目標引用放在分隔符 :: 前,方法的名稱放在後面,及 ClassName::methodName,注意:調用構造函數引用爲ClassName::new 。
public class TestMethodAddr { @FunctionalInterface public interface FunInterface { TestMethodAddr getTestMethodAddr(String a,String b); } private String a; private String b; public TestMethodAddr(String a,String b){ this.a = a; this.b = b; } public String addStr(){ return a + b; } public String append(String c){ return a + "," + b + "," + c; } public static void main(String[] args){ FunInterface funInterface = TestMethodAddr::new; TestMethodAddr test = funInterface.getTestMethodAddr("A", "B"); System.out.println(test.addStr()); System.out.println(test.append("C")); } }
4、Stream
Java 8 中添加了一個新的抽象稱爲流Stream,可讓你以一種聲明的方式處理數據。能夠將Stream看做一種流,流在管道中傳輸,而且能夠在管道的節點上進行處理,如排序、篩選、聚合運算等。
Stream是一個來自數據源的元素隊列並支持聚合操做。Stream提供了內部迭代的方法,經過訪問者模式(Visitor)實現(iterator、foreach爲外部迭代)。
4.1 生成流stream:使用方法stream() 爲集合建立串行流,parallelStream() 爲集合建立並行流。
4.2 forEach:stream提供了新的方法 forEach來迭代流中的每一個數據。如:
List list = Arrays.asList(1,2,3,4,5);
list.stream().forEach(System.out::println);
4.3 map:stream提供了map方法來用於映射每一個元素到對應的結果。如:
List<Integer> list = Arrays.asList(1,2,3,4,5); list.stream().map(i -> i + i); list.stream().map(i -> i + i).forEach(System.out::println);
4.4 filter: filter方法用於經過設置條件過濾出元素。如:
List<Integer> list = Arrays.asList(1,2,3,4,5); // 過濾大於3的元素 list.stream().filter(i -> i > 3).forEach(System.out::println);
4.5 limit:limit方法用於獲取指定數量的流。如:
List<Integer> list = Arrays.asList(1,2,3,4,5); // 獲取前 3個stream流 list.stream().limit(3).forEach(System.out::println);
4.6 Sorted:sorted方法用於對流進行排序。如:
List<Integer> list = Arrays.asList(5,2,3,1,4); // 將list中的元素從小到大進行排序 list.stream().sorted((a,b) -> (a > b ? 1 : -1)).forEach(System.out::println);
5、日期時間
新增各類日期時間處理類。
LocalDate爲日期處理類、LocalTime爲時間處理類、LocalDateTime爲日期時間處理類。
DateTimeFormatter格式化日期時間處理類。