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。

Intellij IDEA 2018.1.1版本已经支持JDK10 局部变量推断类型,并且使用方法比较简单,这里使用该IDE进行JDK10
局部变量类型推断的演示。

Intellij IDEA 2018.1.1启用局部变量推断

首先你要安装JDK10,JDK10下载地址
然后安装完最新版本IDEA之后,新建一个Java Project,进入项目界面之后,选择 Project Structure

《JDK10 局部类型推断》

然后选择已经安装好的 JDK10
《JDK10 局部类型推断》

在下拉列表中选择 10-Local variable type inference
《JDK10 局部类型推断》

点击OK之后,就可以体验JDK10 局部变量类型推断的特性了。

特性展示

1. 局部变量类型推断使用的标识符是 var

代码清单 1-1

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

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

}

输出结果

HelloWorld

编译器根据局部变量右边的字符串"HelloWorld",推断局部变量strString类型。

代码清单 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……

    原文作者:smallclover
    原文地址: https://segmentfault.com/a/1190000014295104
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞