【lombok】var - 无忧的局部变量

var使用方法

var的工作原理与val完全相同,但局部变量不会标记为final。

该类型仍然推断至初始化表达式,并且任何重新的赋值都是合法的(因为变量不再是final类型),但不会再查找以确定适当的类型(我个人的理解是:已推导出某个类型,虽然又重新赋值,但不会再重新推导出另一个合适类型)。

例如,var x =“Hello”; x = Color.RED; 不起作用; x的类型将被推断为java.lang.String,因此,x = Color.RED赋值将失败。 如果x的类型被推断为java.lang.Object,则此代码将被编译,但这不是var的工作方式。

一般情况下我们申明类型,总是需要这么写

1
2
3
4
5
6
//  列表
ArrayList<String> example = new ArrayList<>();
// map
Map<String, Integer> map = new HashMap<>(12);
// java对象
JavaBean bean = new JavaBean();

但是,有了var, 我们不再需要这么麻烦!
先引入maven坐标

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.4</version>
    <scope>provided</scope>
</dependency>

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package com.amos;

import lombok.var;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.stream.Stream;

/**
* @author amos
*/
public class VarExample {

public void example1() {
// var -> List<String>
var example = new ArrayList<String>();
example.add("Hello, World!");
// var -> String
var foo = example.get(0);
System.out.println(foo.toLowerCase());
}

public void example2() {
// var -> Map<Integer, String>
var map = new HashMap<Integer, String>();
map.put(0, "zero");
map.put(5, "five");
// var -> Map.Entry<Integer, String>
for (var entry : map.entrySet()) {
System.out.printf("%d: %s\n", entry.getKey(), entry.getValue());
}
}

public void example3() {
// var -> Person
var person = new Person();
person.setName("amos");
person.setAge(22);
System.out.println(person);
}

public void example4() {
// var -> Integer[]
var integers = new Integer[]{
1 , 2 , 3
};
// var -> Integer
int num = 2;
Integer foundNum = Stream.of(integers).filter(s -> s.equals(num)).findAny().orElse(0);
System.out.println(foundNum);

}

public static class Person {
private String name;
private int age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
}

不可用

不可用 于java类的属性(field)

1
2
3
 public class example{
var abc = "hello world";
}

不可用 于指定方法的入参类型

1
2
3
4
5
 public class example{
public void fun(var xyz){
// bala bala
}
}

本章完!