很多人抱怨Java是一种强类型,需要引入大量的样板代码。很明显类型声明往往被认为是不必要的。JDK10之前的 Java代码中,声明一个变量是非常繁琐的:
String str = "abc";
long l = 10L;
boolean b = true;
ArrayList<String> list = new ArrayList();
Stream<String> stream = list.stream();
许多流行的编程语言都已经支持某种形式的局部变量类型推断,如JS(var)。
JDK10局部变量类型推断的使用
JDK10 可以使用 var 进行 局部变量类型推断。
var str = "abc"; // 推断为 字符串类型
var l = 10L; // 推断为long 类型
var flag = true; // 推断为 boolean 类型
var list = new ArrayList<String>(); // 推断为 ArrayList<String>
var stream = list.stream(); // 推断为 Stream<String>
局部变量类型推断使用场景
- 局部变量
- 循环内
public class demo01var {
// var x = 10; // 成员变量不能使用var
public static void main(String[] args) {
var a = 1;
var str = "abc";
var flag = true;
var list = new ArrayList<String>();
list.add("aa");
var stream = list.stream();
for (var s : list) {
System.out.println(s);
}
for (var i = 0; i < 10; i++) {
var x = 5;
}
}
}
局部变量类型推断不能使用场景
- 成员变量
- 方法参数
- 方法返回类型
public class demo01var {
// var x = 10; // 成员变量不能使用var
public static void main(String[] args) {
}
// 参数不能使用var
// public static void test01(var a) {}
/* 方法返回类型不能使用var
public static var test02() {
return true;
}*/
}
局部变量类型推断注意事项
- var 并不是一个关键字,可以作为标识符,这意味着可以将一个变量、方法、包名写成 var 。不过一般情况下 不会有人这么写的,因为这本身就违反了普遍的命名规范。
// var 并不是一个关键字,而是一个保留的类型名称,这意味着可以将一个变量、方法、包名写成 `var`。
public static void test03() {
var var = 10;
System.out.println("var = " + var);
}
- var 声明变量的时候必须赋值、不能用于声明多个变量的情况。
// var 不能用来声明没有赋值的变量、不能用于声明多个变量的情况。
public static void test04() {
// var x = null; // 不行,推断不出到底是什么类型
int x = 1, y = 2; // 可以
// var m = 1, n = 2; // 不行
}
小结
我们了解了JDK10之前定义变量是比较繁琐的,通过JDK10的局部变量类型推断定义变量更加的简单。
如何进行局部变量类型推断?
将变量名左边的类型替换成var即可
var i = 3;
什么情况下可以使用局部变量类型推断?
- 局部变量
- 循环中的变量