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'作為分割。編碼輸出最後沒有行分割。