JDK10 局部類型推斷

JDK10 局部變量類型推斷(一)

JDK10 Local-Variable Type Inference

想要體驗 JDK10 局部變量類型推斷,能夠選擇Eclipse Oxygen或者Intellij IDEA 2018.1.1,可是目前(2018.4.10)來看Eclipse Oxygen官方沒有給出原生支持,只能經過插件的方式來體驗 Java 10 Support for Oxygen,並且還有部分bug,詳情請參考該插件的issue。html

Intellij IDEA 2018.1.1版本已經支持JDK10 局部變量推斷類型,而且使用方法比較簡單,這裏使用該IDE進行JDK10
局部變量類型推斷的演示。java

Intellij IDEA 2018.1.1啓用局部變量推斷

首先你要安裝JDK10,JDK10下載地址
而後安裝完最新版本IDEA以後,新建一個Java Project,進入項目界面以後,選擇 Project Structurewindows

clipboard.png

而後選擇已經安裝好的 JDK10
clipboard.pngoracle

在下拉列表中選擇 10-Local variable type inference
clipboard.pngeclipse

點擊OK以後,就能夠體驗JDK10 局部變量類型推斷的特性了。ide

特性展現

1. 局部變量類型推斷使用的標識符是 var

代碼清單 1-1idea

/**
 * Local-Variable Type Inference
 */
public class Main {

    public static void main(String[] args) {
        var str = "HelloWorld";
        System.out.println(str);
    }

}

輸出結果spa

HelloWorld

編譯器根據局部變量右邊的字符串"HelloWorld",推斷局部變量strString類型。.net

代碼清單 1-2插件

import java.util.ArrayList;

/**
 * Local-Variable Type Inference
 */
public class Main {

    public static void main(String[] args) {
        var list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.stream().forEach(System.out::println);
    }

}

輸出結果

1
2
3

編譯器根據局部變量右邊的ArrayList<Integer>,推斷局部變量listArrayList類型。

爲了說明如下她的優勢咱們看看JDK10以前的版本是如何聲明的

代碼清單 1-3

import java.util.ArrayList;
import java.util.List;

/**
 * Local-Variable Type Inference
 */
public class Main {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.stream().forEach(System.out::println);
    }

}

輸出結果

1
2
3

與代碼 1-2 對比,好處是比較明顯的她避免的信息的信息冗餘,讓代碼再也不那麼囉嗦,另外還有一點是對其了變量名,方便程序的閱讀,不過這一點可能不是那麼重要若是你不在意的話。

舉兩個例子:

代碼清單 1-4

/**
 * Local-Variable Type Inference
 */
public class Main {

    public static void main(String[] args) {
        ThisIsATestForJDK10LocalVariableTypeInference a = new ThisIsATestForJDK10LocalVariableTypeInference();
        var b = new ThisIsATestForJDK10LocalVariableTypeInference();
    }

}

class ThisIsATestForJDK10LocalVariableTypeInference {

}

對比以上兩種類的定義,效果應該來講是比較明顯的。
第二個例子是關於變量名對齊

代碼清單 1-5

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 * Local-Variable Type Inference
 */
public class Main {

    public static void main(String[] args) {
        int a = 1;
        ArrayList<String> b = new ArrayList<>();
        Map<String, Integer> c = new HashMap<>();
        String d = "HelloWorld";
        
        
        var a_1 = 1;
        var b_1 = new ArrayList<String>();
        var c_1 = new HashMap<String, Integer>();
        var d_1 = "HelloWorld";
    }

}

對比該類中,上下兩種定義方式,應該說第二種方式閱讀起來更加方便。(ps:這裏的變量聲明的命名不規範)

2. 標識符var 是保留字而不是關鍵字

不能使用var做爲類名,但能夠做爲變量名,方法名等。

代碼清單 1-5

/**
 * Local-Variable Type Inference
 */
public class Main {

    public static void main(String[] args) {
        var var = 10;
    }

    public void var() {

    }
}

未完待續......To Be Continued......

相關文章
相關標籤/搜索