天天看點

Java 8 新特性1、Lambda 表達式2、方法引用(方法引用使用一對冒号 ::)3、函數式接口(Functional Interface)4、預設方法5、Stream API6、Optional 類7、Nashorn, JavaScript 引擎8、Date Time API9、Base64編碼

Java8 新增了非常多的特性

1、Lambda 表達式

Lambda允許把函數作為一個方法的參數(函數作為參數傳遞進方法中)。

lambda 表達式隻能引用标記了 final 的外層局部變量,這就是說不能在 lambda 内部修改定義在域外的局部變量,否則會編譯錯誤

2、方法引用(方法引用使用一對冒号 ::)

方法引用提供了非常有用的文法,可以直接引用已有Java類或對象(執行個體)的方法或構造器。與lambda聯合使用,方法引用可以使語言的構造更緊湊簡潔,減少備援代碼。

3、函數式接口(Functional Interface)

就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的接口。

4、預設方法

預設方法就是一個在接口裡面有了一個實作的方法。

5、Stream API

新添加的Stream API(java.util.stream) 把真正的函數式程式設計風格引入到Java中。可以極大提高Java程式員的生産力,讓程式員寫出高效率、幹淨、簡潔的代碼。

這種風格将要處理的元素集合看作一種流, 流在管道中傳輸, 并且可以在管道的節點上進行處理, 比如篩選, 排序,聚合等。

元素流在管道中經過中間操作(intermediate operation)的處理,最後由最終操作(terminal operation)得到前面處理的結果。

Stream操作還有兩個基礎的特征:

Pipelining: 中間操作都會傳回流對象本身。 這樣多個操作可以串聯成一個管道, 如同流式風格(fluent style)。 這樣做可以對操作進行優化, 比如延遲執行(laziness)和短路( short-circuiting)。

内部疊代: 以前對集合周遊都是通過Iterator或者For-Each的方式, 顯式的在集合外部進行疊代, 這叫做外部疊代。 Stream提供了内部疊代的方式, 通過通路者模式(Visitor)實作

在 Java 8 中, 集合接口有兩個方法來生成流:

stream() − 為集合建立串行流。

parallelStream() − 為集合建立并行流。

流方法:

forEach:Stream 提供了新的方法 'forEach' 來疊代流中的每個資料

map:用于映射每個元素到對應的結果

filter:用于通過設定的條件過濾出元素

imit:用于擷取指定數量的流

sorted:用于對流進行排序

parallelStream:并行處理程式的代替方法

Collectors:類實作了很多歸約操作,例如将流轉換成集合和聚合元素

統計:最大、最小、總和、平均

6、Optional 類

Optional 類已經成為 Java 8 類庫的一部分,用來解決空指針異常。

7、Nashorn, JavaScript 引擎

Java 8提供了一個新的Nashorn javascript引擎,它允許我們在JVM上運作特定的javascript應用。

8、Date Time API

加強對日期與時間的處理。

在舊版的 Java 中,日期時間 API 存在諸多問題,其中有:

非線程安全 − java.util.Date 是非線程安全的,所有的日期類都是可變的,這是Java日期類最大的問題之一。

設計很差 − Java的日期/時間類的定義并不一緻,在java.util和java.sql的包中都有日期類,此外用于格式化和解析的類在java.text包中定義。java.util.Date同時包含日期和時間,而java.sql.Date僅包含日期,将其納入java.sql包并不合理。另外這兩個類都有相同的名字,這本身就是一個非常糟糕的設計。

時區處理麻煩 − 日期類并不提供國際化,沒有時區支援,是以Java引入了java.util.Calendar和java.util.TimeZone類,但他們同樣存在上述所有的問題。

Java 8 在 java.time 包下提供了很多新的 API。以下為兩個比較重要的 API:

Local(本地) − 簡化了日期時間的處理,沒有時區的問題。

Zoned(時區) − 通過制定的時區處理日期時間。

新的java.time包涵蓋了所有處理日期,時間,日期/時間,時區,時刻(instants),過程(during)與時鐘(clock)的操作。

9、Base64編碼

在Java 8中,Base64編碼已經成為Java類庫的标準。

Java 8 内置了 Base64 編碼的編碼器和解碼器。

Base64工具類提供了一套靜态方法擷取下面三種BASE64編解碼器:

基本:輸出被映射到一組字元A-Za-z0-9+/,編碼不添加任何行标,輸出的解碼僅支援A-Za-z0-9+/。

URL:輸出映射到一組字元A-Za-z0-9+_,輸出是URL和檔案。

MIME:輸出隐射到MIME友好格式。輸出每行不超過76字元,并且使用'r'并跟随'n'作為分割。編碼輸出最後沒有行分割。