基本型別
使用為基本型別定製的IntStream可以提升系統效能。 在java中,int佔4個位元組,Integer佔16個位元組。在一些情況下使用基本型別更加高效,所以java8有一些專門的基本型別操作,例如: mapToInt(),返回IntStream物件。
過載
方法出現過載overload,javac會挑出最具體的那個,否則報錯。
@FunctionalInterface
函式介面上面需要新增次註釋。
複製程式碼
介面中的預設方法,(介面可以有方法的實現)
以下程式碼片段為Iterable介面中的foreach方法:
/**
* Performs the given action for each element of the {@code Iterable}
* until all elements have been processed or the action throws an
* exception. Unless otherwise specified by the implementing class,
* actions are performed in the order of iteration (if an iteration order
* is specified). Exceptions thrown by the action are relayed to the
* caller.
*
* @implSpec
* <p>The default implementation behaves as if:
* <pre>{@code
* for (T t : this)
* action.accept(t);
* }</pre>
*
* @param action The action to be performed for each element
* @throws NullPointerException if the specified action is null
* @since 1.8
*/
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
複製程式碼
在Iterable介面中有一個方法,該方法是default修飾的,成為預設方法。這種方法存在的原因是為了解決不同java版本的相容問題。 java1-7的程式碼,可以直接在jvm8裡面執行,這是java最大的優勢,但是java8加入了一些新的特性,導致相容存在問題,比如: java8中為Collection介面增加了stream方法,導致所有自建的集合類必須實現stream方法。但是在java7中的自建集合類,並沒有實現該方法。這樣舊程式碼在java8中無法編譯通過。
這種相容性問題的解決方案就是預設方法。上面的例子中,把stream方法變為預設方法,如果子類沒有實現此方法,就直接使用介面的預設方法。這樣java7的自建集合就可以在java8中編譯通過。
介面的靜態方法
java8還允許介面有靜態方法,如常用的Stream.of()
複製程式碼
Optional物件
當你不確定返回的物件是否為空時,可以使用Optional物件作為返回值。他表示:null或者物件。
Optional可以避免空值相關的缺陷。
複製程式碼