1. 程式人生 > >Java8以及Java9的一些有用的新特性總結

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