文檔地址:
http://docs.oracle.com/javase/8/docs/
Oracle有兩個實現了Java平臺標準版本(Java SE)8,即Java標準開發工具(JDK)8和Java標準運行時環境(JRE)8.
JDK8是JRE8的超集,包含了JRE8的所有內容,還包括諸如編譯器和調試器等在開發applet和application時必要的開發環境。JRE8提供函數庫,java虛擬機(JVM)以及其他用於運行用Java編程語言編寫的applets和applications。注意,JRE包含了在Java SE規範中並不作要求的組件,包括標準和非標準Java組件。
圖1. Java概念圖
Descriptionof Java Conceptual Diagram
Java8中的增強功能
http://docs.oracle.com/javase/8/docs/technotes/guides/language/enhancements.html#javase8
1. lambda表達式(Lambda Expressions):讓你能夠將一個動作單元進行壓縮,並將其傳遞給其他代碼。如果你希望當某個過程結束後,或當某個過程發生異常後,在collection內的每個元素上執行一個特定動作,你可以用lambda表達式來達到目的。lambda表達式由以下特點所支持:
(1)方法引用(Method References):對於已命名的方法,方法引用是緊湊且易讀的lambda表達式;
(2)默認方法(Default Methods):讓你能夠將新功能添加到函數庫的接口,並且確保於舊版本接口的二進制兼容性(binary compatibility)。他們是被實現了的接口方法,並且是方法簽名起始處的默認關鍵詞。此外,你可以在接口中定義靜態方法。
(3)基於Java8中lambda表達式和Streams的新的增強版API(New and Enhanced APIs That Take Advantage of Lambda Expressions and Streams in Java SE 8);
2. 類型推斷個改進:Java編譯器利用目標類型來判斷通用方法調用(generic method invocation)中的參數類型。一個表達式的目標類型,是java編譯器依據該表達式出現位置所期望的數據類型。例如,你可以在Java SE7中將賦值語句的目標類型用於類型推斷。然而,在Java SE 8彙總,你可以在更多場景中將目標類型用於類型推斷。最突出的例子是使用方法調用的目標類型來判斷其參數的數據類型。
考慮如下例子:
List<String> stringList = new ArrayList<>(); stringList.add("A"); stringList.addAll(Arrays.asList());
先暫且忽略泛型(generics),addAll方法期望一個Collection實例作爲參數,並且Arrays.asList方法返回了List實例。該代碼是可行的,因爲List是Collection的子類。
現在考慮泛型,addAll的目標類型是Collection<? exends String>,而Arrays.asList返回了一個List<T>實例。在這個例子中,Java SE8編譯器能夠將類型變量T的值推斷爲String。編譯器是由目標類型Collection<? extends String>推斷出這個結果的。
Java SE8或更早版本的編譯器則不能接受這樣的代碼,因爲他們不能利用目標類型來判斷方法調用參數的類型。例如,Java SE7編譯器會生成類似如下的錯誤信息:
error: no suitable method found for addAll(List<Object>) ...
method List.addAll(Collection<? extends String>) is not applicable (actual argument List<Object> cannot be converted to Collection<? extends String> by method invocation conversion)
因此,在類似這樣的場景中,當Java編譯器不能判斷類型時,你必須用type witnesses顯式指定類型變量的值。
例如,如下代碼在Java SE7中是允許的:
List<String> stringList = new ArrayList<>(); stringList.add("A"); stringList.addAll(Arrays.<String>asList());
See the following sections in the Java Tutorials for more information:
3. java類型註釋:可以將註釋用於任何用到類型的地方。這一特性與可插拔類型系統聯合使用,允許對代碼進行更強的類型檢查。For more information, seeType Annotations and Pluggable Type Systems
in the new
Annotations lesson in the Java Tutorial.
4. 重複註釋:可以將同一個註釋類型在同一個聲明或類型使用中應用多次。For more information, see
Repeating Annotations in the new
Annotations lesson in the Java Tutorial.
5. 方法參數反射:利用java.lang.reflect.Executable.getParameters, 可以獲得任何方法或構造器的形式參數名。(類Method和Constructor繼承自類Executable,因此繼承了方法Executable.getParameters)。然而,.class文件默認情況下並不存儲形式參數名。爲了在一個特殊的.class文件中存儲形式參數名,並因此啓用Reflection API來檢索形式參數名,要用javac編譯器的-parameters選項編譯源文件。SeeObtaining
Names of Method Parameters in the Java Tutorials.