一、Java8常用的新特性總結(jié)
1.1.Java8常用特性總覽

1.2.lambda表達(dá)式
在Java8中引入了一個(gè)新的操作符“->”,該操作符稱為箭頭操作符或Lambda操作符,左側(cè):Lambda表示式的參數(shù)列表,右側(cè):Lambda表達(dá)式中所要執(zhí)行的功能,即把函數(shù)作為一個(gè)方法的參數(shù),通常多用于匿名內(nèi)部類的簡潔寫法,同時(shí)lambda表達(dá)式也是更好的使用StreamAPI的基礎(chǔ)。
1.3.函數(shù)式接口
接口中只有一個(gè)抽象方法的接口,就叫函數(shù)式接口。可以使用注解@FunctionalInterface檢查是否為函數(shù)式接口。例如,我們可以定義一個(gè)處理一個(gè)數(shù)的的函數(shù)接口,數(shù)就是函數(shù)接口的參數(shù),每次怎么處理就是這個(gè)函數(shù)接口的實(shí)現(xiàn),我們調(diào)用這個(gè)函數(shù)接口的時(shí)候就傳入要處理的數(shù)字和處理邏輯就可。簡單示例如下:
@FunctionalInterface
public interface MyFun {
public Integer getValue(Integer num);
}
public Integer operation(Integer num,MyFun mf){
return mf.getValue(num);
}
@Test
public void test5(){
Integer num = operation(100,(x)-> x*x);
System.out.println(num);
}
四大核心函數(shù)接口
-
Consumer消費(fèi)型接口: 參數(shù)類型 T 返回類型void對類型T的對象應(yīng)用操作,Consumer消費(fèi)型是傳入一個(gè)參數(shù),進(jìn)行處理 -
Supplier供給型接口: 參數(shù)類型 無 返回類型 T 返回類型為T的對象,Supplier供給型是得到一些結(jié)果 -
Function<T,R>函數(shù)型接口: 參數(shù)類型 T 返回類型 R 對了類型為T的對象應(yīng)用操作,并返回結(jié)果,Function函數(shù)型是傳入一個(gè)參數(shù),處理后返回一個(gè)結(jié)果 -
Predicate斷言型接口: 參數(shù)類型 T 返回類型boolean確定類型為T的對象是否滿足某約束,并返回布爾值。Predicate斷言型就是做一些判斷操作
1.4.方法引用和數(shù)組引用
當(dāng)要傳遞給Lambda體的操作,已經(jīng)有了實(shí)現(xiàn)的方法,可以使用方法引用. (實(shí)現(xiàn)抽象方法的參數(shù)列表,必須與方法引用方法的參數(shù)列表保持一致)。 方法引用:使用操作符“::”將方法名和對象或類的名字分割開,例如:
- 對象::實(shí)例方法
- 類::靜態(tài)方法
- 類::實(shí)例方法
方法引用的實(shí)質(zhì)就是使用更簡單的方式代替Lambda表達(dá)式
1.5.StreamAPI
這個(gè)可以說是我用的最多的啦,開發(fā)中集合的遍歷,分組,過濾,排序,判斷,篩選等等,Stream是Java8中處理集合的關(guān)鍵抽象概念,它可以指定你希望對集合進(jìn)行測操作,可以執(zhí)行非常復(fù)雜的查找,過濾和映射數(shù)據(jù)的操作,使用Stream API對集合數(shù)據(jù)進(jìn)行操作就類似于使用SQL執(zhí)行的數(shù)據(jù)庫查詢查詢,Stream API提供了一種高效且易于使用的處理數(shù)據(jù)的方式。 流(Stream)是數(shù)據(jù)渠道,用于操作數(shù)據(jù)源(集合、數(shù)組等)所生成的元素序列,“集合講的是數(shù)據(jù),流講的是計(jì)算”,需要注意的是以下三點(diǎn):
- Stream自己不會存儲元素
- Stream不會改變源對象,相會,他們會返回一個(gè)持有結(jié)果的新的Stream
- Stream操作是延遲執(zhí)行的,這意味著他們會等到需要結(jié)果的時(shí)候才執(zhí)行。
Stream使用方法
- 創(chuàng)建Stream:一個(gè)數(shù)據(jù)源(集合、數(shù)組)獲取一個(gè)流
- 中間操作:一個(gè)中間操作鏈,對數(shù)據(jù)源的數(shù)據(jù)進(jìn)行處理
- 終止操作:一個(gè)終止操作,執(zhí)行中間操作鏈,并產(chǎn)生結(jié)果。
1.6.LocalDateTime
LocalDateTime是一個(gè)不可變的日期時(shí)間對象,代表日期時(shí)間,通常被視為年 - 月 - 日 - 時(shí) - 分 - 秒。這個(gè)也是在開發(fā)中使用的最多的,例如統(tǒng)計(jì)數(shù)據(jù)的時(shí)候根據(jù)時(shí)間分組后,統(tǒng)計(jì)當(dāng)前季度或者下一季度的,或者獲取當(dāng)前年月,再例如獲取當(dāng)前月的第一天,當(dāng)前月的最后的一天,下兩個(gè)月的最后一天等等,使用LocalDateTime都可以很簡單的完成,舉個(gè)例子,根據(jù)出生日期計(jì)算年齡:
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE;
LocalDate csrq = LocalDate.parse(csrq, dtf);
LocalDate now = LocalDate.now();
return (int)ChronoUnit.YEARS.between(csrq, now);
1.7.Optional
這個(gè)也可以說是一大神器啦,排除空指針異常呀,有時(shí)候自己寫的你還能注意點(diǎn)盼空,隨著微服務(wù)的使用,調(diào)用其他系統(tǒng)接口,你也不完全知道別人會給你返回個(gè)人什么呀,之前我們可以使用三木運(yùn)算判空或者if判空,現(xiàn)在可以使用Optional更加優(yōu)雅的消除空指針。
1.8.Base64
這個(gè)雖然沒有之前的新特性用的多,但是在最近的項(xiàng)目開發(fā)中使用帶了,就順便記錄一下吧,
String text = "show me the code";
String encoded = Base64.getEncoder().encodeToString(text.getBytes(StandardCharsets.UTF_8));
String decoded = new String(Base64.getDecoder().decode(encoded), StandardCharsets.UTF_8);