Java8以及Java9的一些有用的新特性總結
Java 8:
1.Lambda表示式
首先,什麼是Lambda表示式?
所謂的Lambda表示式通俗的講就是一種沒有名字的函式,其中涉及到一些函數語言程式設計的知識,這在移動開發領域應用十分廣泛,關於函數語言程式設計網路上的資料有很多,有興趣的朋友可以自行查閱,使用這種表示式好處是可以使得我們的程式碼更加的簡潔,當然這會使得程式碼的可讀性大大降低,在一些情況下,也會造成程式碼的效率變差。
下面給出一個使用Lambda表示式的例子:
public class Test03 { public static void main(String[] args) { List<Integer> list=new ArrayList<>(); for(int i=0;i<10;i++){ list.add(i); } list.forEach((temp)-> System.out.println(temp)); } }
定義了一個匿名的函式,其作用就是輸出temp的值。很不一樣,是吧?通過原始碼,我們來看一下forEach()函式的構造:
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
其實也是遍歷了list中的元素,然後丟給action的accept()方法。
2.預設方法
然後看一下Consumer這個引數,其實這是一個函式式介面,這也是Java8的一個新特新
怎麼介面中也可以定義方法了?其實這叫做預設方法,下面是其相關的解釋:@FunctionalInterface public interface Consumer<T> { /** * Performs this operation on the given argument. * * @param t the input argument */ void accept(T t); /** * Returns a composed {@code Consumer} that performs, in sequence, this * operation followed by the {@code after} operation. If performing either * operation throws an exception, it is relayed to the caller of the * composed operation. If performing this operation throws an exception, * the {@code after} operation will not be performed. * * @param after the operation to perform after this operation * @return a composed {@code Consumer} that performs in sequence this * operation followed by the {@code after} operation * @throws NullPointerException if {@code after} is null */ default Consumer<T> andThen(Consumer<? super T> after) { Objects.requireNonNull(after); return (T t) -> { accept(t); after.accept(t); }; }
"預設方法是在介面中定義方法實現的一種方式,並且保證所有已經存在的子類的相容性,所以實現了介面的類預設都擁有在介面中定義的預設方法,這有點像一個抽象類。當一個子類中沒有覆蓋預設方法時,則對子類的該方法的呼叫將呼叫介面中的實現。"
3.靜態方法
public interface Test031 {
static int test(int n){
if(n==1) return 1;
if(n==2) return 1;
return test(n-1)+test(n-2);
}
}
4.優化了HashMap以及concurrenthashmap將HashMap原來的陣列+連結串列的結構優化成了陣列+連結串列+紅黑樹的結構,減少了hash碰撞造成的連結串列長度過長,時間複雜度過高的問題,concurrenthashmap 則改進了原先的分段鎖的方式,採用transient volatile HashEntry<K,V>[] table來儲存資料。
還有的一些特性在http://www.cnblogs.com/pkufork/p/java_8.html中有介紹,這裡不再贅述。
5.JVM
PermGen空間被移除了,取而代之的是Metaspace。JVM選項-XX:PermSize與-XX:MaxPermSize分別被-XX:MetaSpaceSize與-XX:MaxMetaspaceSize所代替。
6.新增原子性操作類LongAdder
7.新增StampedLock
Java9:
1.jshell
使用指南:
http://docs.oracle.com/javase/9/jshell/toc.htm
2.私有介面方法
現在介面真是越來越像強大了,先是可以編寫方法,現在連訪問許可權都可以定義成private的了,我在網上copy了一個例子:
public interface MyInterface {
void normalInterfaceMethod();
default void interfaceMethodWithDefault() { init(); }
default void anotherDefaultMethod() { init(); }
// This method is not part of the public API exposed by MyInterface
private void init() { System.out.println("Initializing"); }
}
大體就是實現介面的類不想把複用程式碼建立為一個預設方法,所以通過一個私有的輔助方法解決這個問題。
3.更改了 HTTP 呼叫的相關api(有點像Retrofit啊,有木有)
HttpClient client = HttpClient.newHttpClient();
HttpRequest req =
HttpRequest.newBuilder(URI.create("http://www.google.com"))
.header("User-Agent","Java")
.GET()
.build();
HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString());
4.集合工廠方法初始化集合類的時候不用使用add()方法去新增元素了,直接呼叫Set.of(...)即可完成初始化。
5.改進了 Stream API
以上就是java8、9的一些新特性,如有錯誤還請指正。
參考文章:
http://www.importnew.com/17262.html
http://liugang594.iteye.com/blog/2063432