java 8 新特性 Lambda stream optional 並行流與Fork/Join框架 新時間日期api

第一次發帖,大佬勿噴,若有不對之處歡迎指出,這些自己在以前學習過程中整理出來的,在工作中也非常實用,希望能幫助一些像我一樣剛畢業不久的小夥伴。需要源碼聯繫qq:1352057131
得之在俄頃,積之在平日。

Java8新特性

在這裏插入圖片描述
在這裏插入圖片描述

lambda表達式

1、Lambda表達式的基礎語法

Java8中引入了一個新的操作符“->”該操作符稱爲箭頭操作符或Lambda操作符,箭頭操作符將Lambda表達式拆分成兩部分
左側:Lambda表達式的參數列表
右側:Lambda表達式中所需執行的功能,即Lambda體
語法格式一:無參數,無返回值
()-> System.out.println(“開始”);
注:右側只有一條語句可以不用寫{}
語法格式二:有一個參數,無返回值
(X)-> System.out.println(X);
語法格式三:若只有一個參數(小括號可以省略),無返回值
X-> System.out.println(X);
語法格式四:有多個參數(小括號可以省略),有返回值,並且Lambda體中有多條語句
Comparator com = (x,y)->{
System.out.println(“函數式接口”);
Return Integer.compare(x,y);
}
語法格式五:若Lambada體中只有一條語句,return和大括號都可以省略不寫
Comparator com = (x,y)-> Integer.compare(x,y);
語法格式六:Lambada表達式參數列表的數據類型可以不寫,因爲JVM編譯器通過上下文推斷出數據類型,即“類型推斷”
(Integer x, Integer y)-> Integer.compare(x,y);

2、java8 內置四大函數接口

一、Comsumer:消費型接口
void accpect(T t);

在這裏插入圖片描述
二、Supplier:供給型接口
T get();
例:產生指定個數的整數,放入集合中並返回
在這裏插入圖片描述
例:固定產生5個整數放入集合中
在這裏插入圖片描述在這裏插入圖片描述
三、Function<T,R>:函數型接口
R apply(T t);
在這裏插入圖片描述
四、Predicate:斷言型接口
Boolean test(T t);
在這裏插入圖片描述

3、其他函數接口

在這裏插入圖片描述

方法引用與構造器引用

1、 方法的引用
若Lambda體中內容有方法已經實現了,我們可以使用方法引用(可以理解爲方法引用是Lambda表達式的另外一種表現形式)
主要有三種語法格式:
 對象::實例方法名
 類::靜態方法名
 類::實例方法名
注意:○1Lambda體中調用方法的參數列表與返回值類型,要與函數式接口中抽象方法的函數列表和返回值類型保持一致
○2 若Lambda參數列表中第一參數是實例方法的調用者,而第二個參數是實例方法的參數時,可以用ClassName::method
在這裏插入圖片描述

2、 構造器的引用
格式:ClassName::new
注意:需要調用的構造器的參數列表要與函數式接口中抽象方法的參數列表保持一致
在這裏插入圖片描述
3、數組引用
格式:Type::new
在這裏插入圖片描述

Stream API

1、理解
Stream:數據渠道,用於操作數據源(集合、數組等)所生成的元素系列
注意:
 Stream自己不會存儲元素
 Stream不會改變源對象。相反,他們會返回同一個持有結果的新Stream
 Stream操作是延遲執行的。這意味着他們會等到需要結果的時候才執行
2、Stream的操作三個步驟
a) 創建Stream:
i. 一個數據源(如:集合、數組),獲取一個流
b) 中間操作:
i. 一箇中間操作鏈,對數據源的數據進行處理
c) 終止操作(終端操作):
i. 一個終止操作,執行中間操作鏈,併產生結果
在這裏插入圖片描述
3、 創建Stream示例

  1. 可以通過Collection系列集合提供的Stream()或ParallelStream()
    在這裏插入圖片描述
  2. 通過Arrays中靜態方法Stream()獲取數組流
    在這裏插入圖片描述
  3. 通過Stream類中的靜態方法of()
    在這裏插入圖片描述
    4)迭代創建無限流
    在這裏插入圖片描述
    4、Stream的中間操作
    多箇中間操作可以連接起來形成流水線,除非流水線上觸發終止操作,否則中間操作不會執行任何處理。而在終止操作時一次性全部處理,
    1)篩選與切片
    在這裏插入圖片描述
    示例:
    在這裏插入圖片描述
    2)映射
    在這裏插入圖片描述
    Map示例:在這裏插入圖片描述
    FlatMap示例:
    在這裏插入圖片描述
    3)排序
    在這裏插入圖片描述
    Sorted示例:
    在這裏插入圖片描述
    Sorted(Comparator comp)示例:
    在這裏插入圖片描述在這裏插入圖片描述

4)查找與匹配在這裏插入圖片描述
allMatch示例:
在這裏插入圖片描述在這裏插入圖片描述
anyMatch示例:
在這裏插入圖片描述
NoneMatch示例:
在這裏插入圖片描述
findFirst示例:
在這裏插入圖片描述
注:Optional
5)歸約
在這裏插入圖片描述
示例:
在這裏插入圖片描述在這裏插入圖片描述
6)收集
在這裏插入圖片描述
示例:
在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

並行流與Fork/Join框架

1)並行流與順序流

在這裏插入圖片描述
示例:在這裏插入圖片描述
2)Fork/Join框架
Fork/Join框架:就是在必要情況下,講一個大任務進行拆分(fork)成若干個小任務(拆到不可再拆時),再將一個個的小任務運算的結果進行join彙總
在這裏插入圖片描述
Fork/join框架與傳統線程池的區別:採取“工作竊取”模式(work-stealing):當執行新的任務時它可以將其拆分成更小的任務執行,並將小的任務加到線程隊列中,然後再從一個隨機線程的隊列中偷一個並把他放在自己的隊列中。相對於一般的線程池實現,fork/join框架的優勢體現在對其中包含的任務的處理上,在一般的線程池中,如果一個線程正在執行的任務由於某些原因無法繼續運行,那麼該線程會處於一個等待狀態。而在fork/join框架實現中,如果某個子問題由於等待另外一個子問題的完成而無法繼續運行。那麼處理該子問題的線程會主動尋找其他尚未運行的子問題來執行。這種方式減少了線程的等待時間,提高了性能。

Optional類

Optional類(java.until.Optional)是一個容器類 ,代表一個值存在或不存在,原來是用null表示一個值不存在,現在Optional可以更好的表達這個概念。並且可以避免空指針異常。
常用方法:
Optional.of(T t):創建一個Optional實例
Optional.empty():創建一個空的Optional實例
Optional.ofNullable(T t):若T不爲null,創建一個Optional實例,否則創建空實例
isPresent():判斷是否包含值
orElse(T t):如果調用對象包含值,返回該值,否則返回t
orElseGet(Supplier s):如果調用對象包含值,返回該值,否則返回s獲取的值
map(Function f):如果有值,對其處理,並返回處理後的Optional,否則返回Optional.empty()
flatMap(Function mapper):與map類似,要求必須返回Optional

接口中的靜態方法與默認方法

在這裏插入圖片描述在這裏插入圖片描述
接口默認方法的“類優先”原則
若一個接口中定義了一個默認方法,而另一個父類或接口中又定義了一個同名的方法時:
 選擇父類中的方法。如果一個父類提供了具體實現,那麼接口中具有相同名稱和參數的默認方法會被忽略
 接口衝突。如果一個父接口提供一個默認方法,而另一個接口也提供了一個具有相同名稱和參數列表的方法(不管方法是否是默認方法),那麼必須覆蓋該方法來解決衝突。

-新時間日期API

LocalDate:日期(年 - 月 - 日)
LocalTime:時間(時 - 分 - 秒)
LocalDateTime:時間日期(年 - 月 - 日 - 時 - 分 - 秒)
Instant:它代表的是時間戳
Duration:計算兩個時間之間的間隔
Period:計算兩個日期之間的間隔
TemporalAdjuster:時間校正器
格式化時間:DateTimeFormatter
ZonedDateTime:這是一個包含時區的完整的日期時間,偏移量是以UTC/格林威治時間爲基準的。
【與7的區別:java.time包中的類是不可變且線程安全的.新的時間及日期API位於java.time中】
示例:
//獲取當前日期
LocalDate date = LocalDate.now();
//獲取當前時間
LocalTime time = LocalTime.now();
//獲取當前時間和日期
LocalDateTime dateTime = LocalDateTime.now();
//獲取年
int year = dateTime.getYear();
//獲取小時
int hour = dateTime.getHour();
在這裏插入圖片描述
//設置年月日時分秒(2121-10-29 13:13:13)
LocalDateTime newDateTime = LocalDateTime
.of(2021,10,29,13,13,13);
//默認獲取UTC時區,UTC時區與北京時間有8小時偏差
Instant it = java.time.Instant.now();
//獲取毫秒級時間戳
long time = it.toEpochMilli();

在這裏插入圖片描述在這裏插入圖片描述
//TemporalAdjuster:時間校正器
LocalDateTime it1 = LocalDateTime.now();//獲取當前時間
//獲取當月的第十天的日期
LocalDateTime it2 = it1.withDayOfMonth(10);
//獲取下個週末
LocalDateTime it3 = it1.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
//獲取下個週五
LocalDateTime it4 = it1.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
//自定義獲取下一個工作日的日期(下週一)
LocalDateTime it5 = it1.with((n) -> {
LocalDateTime it6 = (LocalDateTime) n;//日期強轉
DayOfWeek dayOfWeek = it6.getDayOfWeek();//獲取現在周幾
if(dayOfWeek.equals(DayOfWeek.FRIDAY)) {
return it6.plusDays(3);
} else if(dayOfWeek.equals(DayOfWeek.SATURDAY)) {
return it6.plusDays(2);
}else if(dayOfWeek.equals(DayOfWeek.SUNDAY)) {
return it6.plusDays(1);
}else if(dayOfWeek.equals(DayOfWeek.THURSDAY)) {
return it6.plusDays(4);
}else if(dayOfWeek.equals(DayOfWeek.WEDNESDAY)) {
return it6.plusDays(5);
}else if(dayOfWeek.equals(DayOfWeek.TUESDAY)) {
return it6.plusDays(6);
}else {
return it6.plusDays(7);
}
});
//格式化時間:DateTimeFormatter
//獲取當前時間
LocalDateTime ldt = LocalDateTime.now();
//定義日期轉換格式
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(“yyyy-mm-dd hh:mm:ss”);
String endDate = dtf.format(ldt);

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