今天在別人代碼中發現java8 新特性,發現自己閱讀代碼有點兒吃力,很是汗顏,java8新特性都出來這麼久了,只知其名不見其形,所有今天回家補了補知識。 一、 介面 在java8 中,介面中引入了新的關鍵字default和static,通過使用default修飾方法,可以讓我們在介面中定義具體的方法 ...
今天在別人代碼中發現java8 新特性,發現自己閱讀代碼有點兒吃力,很是汗顏,java8新特性都出來這麼久了,只知其名不見其形,所有今天回家補了補知識。
一、 介面
在java8 中,介面中引入了新的關鍵字default和static,通過使用default修飾方法,可以讓我們在介面中定義具體的方法實現,也可使用static關鍵字來定義介面方法。
public interface InterClass { String test1(String str); default String test2(String str){ return "test2:" + str; } static String test3(String str){ return "test3:" + str; } }
二、Lamdba表達式
Lambda表達式的語法格式如下:
(params) -> expression 或 (params) -> {statements;}
Lambda(蘭佈達)表達式,是推動Java 8 發佈的最重要的新特性,這意味著Java也開始承認了函數式編程。函數式編程的一個特點就是允許把函數本身作為參數傳入另一個函數,還允許返回一個函數。使用Lambda表達式可以使代碼變的更加簡潔緊湊。
下麵代碼解釋了什麼是函數式介面編程:
/** * 函數式介面 * 函數式介面是值僅僅只包含一個抽象方法的介面(可以有多個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表達式的變數作用域:
- Lambda表達式只能引用標記為 final的外層局部變數。
- Lambda表達式的局部變數可以用聲明為final,但是必須在後面的代碼中不能進行修改。
- Lambda表達式中不允許聲明一個與局部變數同名的參數或局部變數。
三、方法引用
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")); } }
四、Stream
Java 8 中添加了一個新的抽象稱為流Stream,可以讓你以一種聲明的方式處理數據。可以將Stream看作一種流,流在管道中傳輸,並且可以在管道的節點上進行處理,如排序、篩選、聚合運算等。
Stream是一個來自數據源的元素隊列並支持聚合操作。Stream提供了內部迭代的方法,通過訪問者模式(Visitor)實現(iterator、foreach為外部迭代)。
- 數據源:stream流的產生對象,可以是集合、數組、IO channel等。
- 元素:指特定類型的對象,形成一個對象。
- 聚合操作:類似sql語句一樣的操作,比如filter、map、limit、find、sorted等。
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);
五、日期時間
新增各種日期時間處理類。
LocalDate為日期處理類、LocalTime為時間處理類、LocalDateTime為日期時間處理類。
DateTimeFormatter格式化日期時間處理類。