关键要点
Java 10 引入了一个闪亮的新功能: 局部变量类型推断. 对于局部变量, 现在可以使用特殊的保留类型名称 "var" 代替实际类型.
提供这个特性是为了增强 Java 语言, 并将类型推断扩展到局部变量的声明上. 这样可以减少板代码, 同时仍然保留 Java 的编译时类型检查.
由于编译器需要通过检查赋值等式右侧 (RHS) 来推断 var 的实际类型, 因此在某些情况下, 这个特性具有局限性, 例如在初始化 Array 和 Stream 的时候.
如何使用新的 "var" 来减少样板代码.
在本文中, 我将通过示例介绍新的 Java SE 10 特性 --"var" 类型. 你将学习如何在代码中正确使用它, 以及在什么情况下不能使用它.
介绍
Java 10 引入了一个闪亮的新功能: 局部变量类型推断. 对于局部变量, 现在可以使用特殊的保留类型名称 "var" 代替实际类型, 如下所示:
var name = "Mohamed Taman";
提供这个特性是为了增强 Java 语言, 并将类型推断扩展到局部变量的声明上. 这样可以减少板代码, 同时仍然保留 Java 的编译时类型检查.
- | Welcome to JShell -- Version 10.0.1
- | For an introduction type: /help intro
- jshell>
- var name = "Mohamed Taman"
- var lastName = str.substring(8)
- System.out.println("Value:"+lastName +",and type is:"+ lastName.getClass().getTypeName())
- import javax.swing.*
- var password = new JPasswordField("Password text")
- String.valueOf(password.getPassword()) // // 将密码的字符数组转换成字符串
- var textField = new JTextField("Hello text")
- textField = password
- textField.getText()
- var number = 10
- number = "InfoQ"
- var list2 = new ArrayList<>(); list2.add(10); list2
- int i = list2.get(0) // 编译错误
- int i = (int) list2.get(0) // 需要进行转换, 获得 int
- var list3 = new ArrayList<Integer>(); list3.add(10); System.out.println(list3)
- int i = list3.get(0)
- for (var x = 1; x <= 5; x++) {
- var m = x * 2; // 等效于: int m = x * 2;
- System.out.println(m);
- }
- var list = Arrays.asList(1,2,3,4,5,6,7,8,9,10)
- for (var item : list) {
- var m = item + 2;
- System.out.println(m);
- }
- var list = List.of(1, 2, 3, 4, 5, 6, 7)
- var stream = list.stream()
- stream.filter(x -> x % 2 == 0).forEach(System.out::println)
- var x = 1> 0 ? 10 : -10
- int i = x
- var x = 1> 0 ? 10 : "Less than zero"; System.out.println(x.getClass()) //Integer
- var x = 1 <0 ? 10 : "Less than zero"; System.out.println(x.getClass()) // String
- BigDecimal squareOf(BigDecimal number) {
- var result= number.multiply(number);
- return result;
- }
- var number = new BigDecimal("2.5")
- number = squareOf(number)
- <T extends Number> List<Integer> toIntgerList(List<T> numbers) {
- var integers = numbers.stream()
- .map(Number::intValue)
- .collect(Collectors.toList());
- return integers;
- }
- var numbers = List.of(1.1, 2.2, 3.3, 4.4, 5.5)
- var integers = toIntgerList(numbers)
- <T extends Number> List<Integer> toIntgerList(List<T> numbers) {
- var integers = numbers.stream()
- .map(Number::intValue)
- .collect(Collectors.toList());
- return integers;
- }
- var numbers = List.of(1.1, 2.2, 3.3, 4.4, 5.5)
- var integers = toIntgerList(numbers)
- var message = "running..." //effectively final
- var runner = new Runnable(){
- @Override
- public void run() {
- System.out.println(message);
- }}
- runner.run()
- void testVar(boolean b) {
- var x;
- if (b) {
- x = 1;
- } else {
- x = 2;
- }
- System.out.println(x);
- }
- var numbers = new int[]{
- 2, 4, 6
- }
- var number = numbers[1]
- number = number + 3
- class Clazz {
- private var name;
- }
- try {
- Files.readAllBytes(Paths.get("c:\temp\temp.txt"));
- } catch (var e) {}
- JDK 10 Documentation https://docs.oracle.com/javase/10/
- Hands-on Java 10 Programming with JShell.
- JEP 286: Local-Variable Type Inference http://openjdk.java.net/jeps/286 .
- Definite Assignment