概述

您可以使用val作为局部变量声明的类型,而不用实际编写该类型。执行此操作时,将从初始化表达式推断出类型。该本地变量也将成为final型变量。此功能仅适用于局部变量和foreach循环,而不适用于类属性(field)。初始化表达式是必需的。

val实际上是一种”类型”,在lombok包中作为一个真正的类存在。您必须导入它才能使val工作(或使用lombok.val作为类型)。在本地变量声明中存在这种类型会触发添加final关键字以及复制初始化表达式的类型,该类型会覆盖”伪”val类型。

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

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

又或者说,我们需要将其申明为不可变对象,则又需要加上 final . 但是,有了val, 我们不再需要这么麻烦!

先引入maven坐标

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

val示例

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
package com.amos;

import lombok.val;

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

public class ValExample {

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

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

// val -> final Person
val person = new Person();
person.setName("amos");
person.setAge(22);
System.out.println(person);

// val -> final String[]
val strings = new String[]{
"中国", "唐伯虎", "美人鱼"
};
// val -> final String
val str = "美人鱼";

val foundStr = Stream.of(strings).filter(s -> s.equals(str)).findAny().orElse("null");
System.out.println(foundStr);
}

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{
val abc = "hello world";
}

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

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