1. 程式人生 > >Java9都快釋出了,Java8的十大新特性你瞭解多少呢?

Java9都快釋出了,Java8的十大新特性你瞭解多少呢?

Java 9預計將於今年9月份釋出,這是否會是一次里程碑式的版本,我們拭目以待。今天,我們先來複習一下2014年釋出的Java 8的十大新特性。


Java 8可謂是自Java 5以來最具革命性的版本了,她在語言、編譯器、類庫、開發工具以及Java虛擬機器等方面都帶來了不少新特性。我們來一一回顧一下這些特性。

一、Lambda表示式

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 }

二、介面的預設方法與靜態方法

我們可以在介面中定義預設方法,使用default關鍵字,並提供預設的實現。所有實現這個介面的類都會接受預設方法的實現,除非子類提供的自己的實現。例如:

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++中抽象類的理念,以後我們再也不用在每個實現類中都寫重複的程式碼了。

三、方法引用

通常與Lambda表示式聯合使用,可以直接引用已有Java類或物件的方法。一般有四種不同的方法引用:

  1. 構造器引用。語法是Class::new,或者更一般的Class< T >::new,要求構造器方法是沒有引數;

  2. 靜態方法引用。語法是Class::static_method,要求接受一個Class型別的引數;

  3. 特定類的任意物件方法引用。它的語法是Class::method。要求方法是沒有引數的;

  4. 特定物件的方法引用,它的語法是instance::method。要求方法接受一個引數,與3不同的地方在於,3是在列表元素上分別呼叫方法,而4是在某個物件上呼叫方法,將列表元素作為引數傳入;

四、重複註解

在Java 5中使用註解有一個限制,即相同的註解在同一位置只能宣告一次。Java 8引入重複註解,這樣相同的註解在同一地方也可以宣告多次。重複註解機制本身需要用@Repeatable註解。Java 8在編譯器層做了優化,相同註解會以集合的方式儲存,因此底層的原理並沒有變化。

五、擴充套件註解的支援

Java 8擴充套件了註解的上下文,幾乎可以為任何東西添加註解,包括區域性變數、泛型類、父類與介面的實現,連方法的異常也能添加註解。

六、Optional

Java 8引入Optional類來防止空指標異常,Optional類最先是由Google的Guava專案引入的。Optional類實際上是個容器:它可以儲存型別T的值,或者儲存null。使用Optional類我們就不用顯式進行空指標檢查了。

七、Stream

Stream API是把真正的函數語言程式設計風格引入到Java中。其實簡單來說可以把Stream理解為MapReduce,當然Google的MapReduce的靈感也是來自函數語言程式設計。她其實是一連串支援連續、並行聚集操作的元素。從語法上看,也很像linux的管道、或者鏈式程式設計,程式碼寫起來簡潔明瞭,非常酷帥!

八、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這些類,對於時間日期的改進還是非常不錯的。

九、JavaScript引擎Nashorn

Nashorn允許在JVM上開發執行JavaScript應用,允許Java與JavaScript相互呼叫。

十、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,元資料空間)。