文章目錄
Java8新特性
1、接口的默認方法
傳統方法
在Java8之前Java中接口裏面的方法默認都是public abstract 修飾的抽象方法並且沒有方法體
eg.
傳統接口:
字段:默認由public static final修飾
方法:默認由public abstract修飾(抽象方法)
jdk1.8後新方法
共同點:由static或者default修飾的方法必須有方法體
static方法
1、使用static修飾接口中的方法並且必須有主體;
2、接口的static方法只能夠被接口本身調用;接口名.方法名(…);
3、接口的static方法不能夠被子接口繼承;
4、接口的static方法不能夠被實現類覆寫及直接調用;
default方法
在接口中可以定義一個使用default修飾有方法體的方法,接口中可以對這個方法提供默認的一種實現。
1、使用default修飾接口中的方法並且必須有主體;
2、接口的default方法不能夠被接口本身調用,需要接口的實例(實現類對象)來調用;
3、接口的default方法可以被子接口繼承、覆寫或者[實現類對象]直接調用;
4、接口的default方法可以被實現類覆寫及直接調用;
2、 函數式接口
函數式接口(Functional Interface)就是一個有且僅有一個抽象方法的[接口],但是可以有多個非抽象方法的接口。函數式接口可以被隱式轉換爲lambda表達式。
可以通過lambda的方式去實現接口!
可以使用註解@FunctionalInterface標記該接口爲函數式接口
3、Lambda表達式
可以看成是對匿名內部類的簡寫,使用Lambda表達式時,接口必須是函數式接口。
//基本語法:
<函數式接口> <變量名> = (參數1,參數2...) -> {
//方法體
}
特點說明:
(參數1,參數2…)表示參數列表;->表示連接符;{}內部是方法體
1、=右邊的類型會根據左邊的函數式接口類型自動推斷;
2、如果形參列表爲空,只需保留();佔位
3、如果形參只有1個,()可以省略,只需要參數的名稱即可;
4、如果執行語句只有1句,且無返回值,{}可以省略,若有返回值,則若想省去{},則必須同時省略return,且執行語句也保證只有1句;
5、形參列表的數據類型會自動推斷;
6、lambda不會生成一個單獨的內部類文件;
7、lambda表達式若訪問了局部變量,則局部變量必須是final的,若是局部變量沒有加final關鍵字,系統會自動添加,此後在修改該局部變量,會報錯。
4、方法引用
(類變量:有static 實例變量:沒有static修飾)
構造方法的引用
函數式接口的名稱 變量名=類名::new;(會去調用類中對應的構造方法)
靜態方法的引用
函數式接口的名稱 變量名=類名::方法名;
實例方法的引用
使用java自帶的Function接口
函數式接口的名稱 變量名=對象::方法名;
5、Java 8 Stream流
操作對象:數組 集合 io流 產生器
需要操作對象調用stream()或者paralleStream()轉換成串行流或者並行流
常用Stream流方法
foreach 遍歷
map(lambda)
count() 統計
limit(int 值)
filter(lambda)過濾
sorted()排序
distinct()去重
collect() 規約 Collectors.toList()
6、Optional類
特點
Optional 類是一個可以爲null的容器對象。如果值存在則isPresent()方法會返回true,調用get()方法會返回該對象。
Optional 是個容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。
Optional 類的引入很好的解決空指針異常。
善用Optional可以使我們代碼中很多繁瑣、醜陋的設計變得十分優雅。
7、日期時間 API
Java 8 在 java.time 包下提供了很多新的 API。以下爲兩個比較重要的 API:
Local(本地) − 簡化了日期時間的處理,沒有時區的問題。
Zoned(時區) − 通過制定的時區處理日期時間。
本地化日期時間API
LocalDate / LocalTime 和 LocalDateTime 類可以在處理時區不是必須的情況。
//獲取當前系統時間
LocalDateTime currentTime = LocalDateTime.now();
System.out.println("當前時間: " + currentTime);
//獲取當前年月日
LocalDate date1 = currentTime.toLocalDate();
System.out.println("date1: " + date1);
//獲取當前月份
Month month = currentTime.getMonth();
//獲取當前月份的號數
int day = currentTime.getDayOfMonth();
//獲取當前時間的秒數
int seconds = currentTime.getSecond();
//打印月日秒
System.out.println("月: " + month +", 日: " + day +", 秒: " + seconds);
使用時區的日期時間API
ZonedDateTime類可以獲取不同地方時區
// 獲取當前時間日期
ZonedDateTime date1 =ZonedDateTime.parse("2018-12-03T10:15:30+05:30[Asia/Shanghai]");
System.out.println("date1: " + date1);
//調整時區
ZoneId id = ZoneId.of("Europe/Paris");
System.out.println("ZoneId: " + id);
//獲得當前時區
ZoneId currentZone = ZoneId.systemDefault();
System.out.println("當期時區: " + currentZone);