Java8新特性

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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章