Java 8可謂是自Java 5以來最具革命性的版本了,她在語言、編譯器、類庫、開發工具以及Java虛擬機等方面都帶來了很多新特性。咱們來一一回顧一下這些特性。java
1、Lambda表達式linux
Lambda表達式能夠說是Java 8最大的賣點,她將函數式編程引入了Java。Lambda容許把函數做爲一個方法的參數,或者把代碼當作數據。編程
一個Lambda表達式能夠由用逗號分隔的參數列表、–>符號與函數體三部分表示。例如:數組
Arrays.asList( "p", "k", "u","f", "o", "r","k").forEach( e -> System.out.println( e ) );併發
1 Arrays.asList( "p", "k", "u","f", "o", "r","k").forEach( e -> System.out.println( e ) ); 函數式編程
爲了使現有函數更好的支持Lambda表達式,Java 8引入了函數式接口的概念。函數式接口就是隻有一個方法的普通接口。java.lang.Runnable與java.util.concurrent.Callable是函數式接口最典型的例子。爲此,Java 8增長了一種特殊的註解@FunctionalInterface:函數
1 @FunctionalInterface 2 public interface Functional { 3 void method(); 4 }
2、接口的默認方法與靜態方法工具
咱們能夠在接口中定義默認方法,使用default關鍵字,並提供默認的實現。全部實現這個接口的類都會接受默認方法的實現,除非子類提供的本身的實現。例如:post
1 public interface DefaultFunctionInterface { 2 default String defaultFunction() { 3 return "default function"; 4 } 5 }
咱們還能夠在接口中定義靜態方法,使用static關鍵字,也能夠提供實現。例如:開發工具
1 public interface StaticFunctionInterface { 2 static String staticFunction() { 3 return "static function"; 4 } 5 }
接口的默認方法和靜態方法的引入,其實能夠認爲引入了C++中抽象類的理念,之後咱們不再用在每一個實現類中都寫重複的代碼了。
3、方法引用
一般與Lambda表達式聯合使用,能夠直接引用已有Java類或對象的方法。通常有四種不一樣的方法引用:
-
構造器引用。語法是Class::new,或者更通常的Class< T >::new,要求構造器方法是沒有參數;
-
靜態方法引用。語法是Class::static_method,要求接受一個Class類型的參數;
-
特定類的任意對象方法引用。它的語法是Class::method。要求方法是沒有參數的;
-
特定對象的方法引用,它的語法是instance::method。要求方法接受一個參數,與3不一樣的地方在於,3是在列表元素上分別調用方法,而4是在某個對象上調用方法,將列表元素做爲參數傳入;
4、重複註解
在Java 5中使用註解有一個限制,即相同的註解在同一位置只能聲明一次。Java 8引入重複註解,這樣相同的註解在同一地方也能夠聲明屢次。重複註解機制自己須要用@Repeatable註解。Java 8在編譯器層作了優化,相同註解會以集合的方式保存,所以底層的原理並無變化。
5、擴展註解的支持
Java 8擴展了註解的上下文,幾乎能夠爲任何東西添加註解,包括局部變量、泛型類、父類與接口的實現,連方法的異常也能添加註解。
6、Optional
Java 8引入Optional類來防止空指針異常,Optional類最早是由Google的Guava項目引入的。Optional類其實是個容器:它能夠保存類型T的值,或者保存null。使用Optional類咱們就不用顯式進行空指針檢查了。
7、Stream
Stream API是把真正的函數式編程風格引入到Java中。其實簡單來講能夠把Stream理解爲MapReduce,固然Google的MapReduce的靈感也是來自函數式編程。她實際上是一連串支持連續、並行彙集操做的元素。從語法上看,也很像linux的管道、或者鏈式編程,代碼寫起來簡潔明瞭,很是酷帥!
8、Date/Time API (JSR 310)
Java 8新的Date-Time API (JSR 310)受Joda-Time的影響,提供了新的java.time包,能夠用來替代 java.util.Date和java.util.Calendar。通常會用到Clock、LocaleDate、LocalTime、LocaleDateTime、ZonedDateTime、Duration這些類,對於時間日期的改進仍是很是不錯的。
9、JavaScript引擎Nashorn
Nashorn容許在JVM上開發運行JavaScript應用,容許Java與JavaScript相互調用。
10、Base64
在Java 8中,Base64編碼成爲了Java類庫的標準。Base64類同時還提供了對URL、MIME友好的編碼器與解碼器。
除了這十大新特性以外,還有另外的一些新特性:
-
更好的類型推測機制:Java 8在類型推測方面有了很大的提升,這就使代碼更整潔,不須要太多的強制類型轉換了。
-
編譯器優化:Java 8將方法的參數名加入了字節碼中,這樣在運行時經過反射就能獲取到參數名,只須要在編譯時使用-parameters參數。
-
並行(parallel)數組:支持對數組進行並行處理,主要是parallelSort()方法,它能夠在多核機器上極大提升數組排序的速度。
-
併發(Concurrency):在新增Stream機制與Lambda的基礎之上,加入了一些新方法來支持彙集操做。
-
Nashorn引擎jjs:基於Nashorn引擎的命令行工具。它接受一些JavaScript源代碼爲參數,而且執行這些源代碼。
-
類依賴分析器jdeps:能夠顯示Java類的包級別或類級別的依賴。
-
JVM的PermGen空間被移除:取代它的是Metaspace(JEP 122)。
Java 8是一次變化巨大的更新,耗費了工程師大量的時間,還借鑑了不少其它語言和類庫。咱們沒法在這裏一一詳細列舉,之後有機會必定給你們詳細解讀一下。