🤷 场景
一般来说,在 Java 中声明变量时,需要指定类型。比如下方的 List:
List<String> example = new ArrayList<String>();
😎 Lombok 解决方案
提供了两个声明本地变量的注解,只能用于本地变量或者 for 循环中。
- val:final 本地变量,实际类型从初始化表达式中推断而来,并加 final 修饰。
- var: 可变本地变量,实际类型从初始化表达式中推断而来,不加 final 修饰。
// Lombok 代码
val example = new ArrayList<String>();
// 反编译后的代码
final ArrayList<String> example = new ArrayList<String>();
// Lombok 代码
var example = new ArrayList<String>();
// 反编译后的代码
ArrayList<String> example = new ArrayList<String>();
😎 JDK 解决方案
JDK 10 新特性 - 本地变量类型推断。😎 嘿嘿,好东西,JDK 也会吸收的。
- 背景:Scala 和 C# 都可以使用 var 来声明本地变量,编译器会根据初始化的结果来设置变量的类型。Java 10 基于上述思路,也提供了本地变量类型推断特性。
- 用法:✔️ 仅能用于本地变量类型推断,且必须包含初始化表达式
- 哪些地方不能用?
- ❌ 没有初始化表达式或者为 null 或者 lambda 表达式:没法推断的
- ❌ 方法签名中无法使用:public long process(var list) { }
- 示例代码:
// Java 10 之前的代码
Path path = Paths.get("src/web.log");
try (Stream<String> lines = Files.lines(path)){
long warningCount
= lines
.filter(line -> line.contains("WARNING"))
.count();
System.out.println("Found " + warningCount + " warnings in the
log file");
} catch (IOException e) {
e.printStackTrace();
}
// Java 10 代码
var path = Paths.get("src/web.log");
try (var lines = Files.lines(path)){
var warningCount
= lines
.filter(line -> line.contains("WARNING"))
.count();
System.out.println("Found " + warningCount + " warnings in the
log file");
} catch (IOException e) {
e.printStackTrace();
}
参考
1.https://projectlombok.org/features/val
2.https://projectlombok.org/features/var
3.https://developer.oracle.com/learn/technical-articles/jdk-10-local-variable-type-inference
更多文章
1.消除代码冗长神器 - Lombok | 入门-CSDN博客
2.消除代码冗长神器 - Lombok | 安装-CSDN博客
3.消除代码冗长神器 - Lombok | val/var 本地变量声明-CSDN博客
4.消除代码冗长神器 - Lombok | @Setter/@Getter 生成 setter/getter 方法-CSDN博客
5.消除代码冗长神器 - Lombok | @EqualsAndHashCode/@ToString注解详解-CSDN博客
6.消除代码冗长神器 - Lombok | @NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor 构造方法-CSDN博客
7.消除代码冗长神器 - Lombok | @Data 通用 POJO 注解-CSDN博客
8.消除代码冗长神器 - Lombok | @With 不可变的 setter 方法-CSDN博客
9.消除代码冗长神器 - Lombok | @Value 不可变 entity-CSDN博客
10.消除代码冗长神器 - Lombok | @Cleanup 自动清理资源-CSDN博客
11.消除代码冗长神器 - Lombok | @Log/@Slf4j 创建日志对象-CSDN博客
12.消除代码冗长神器 - Lombok | @Builder注解 - Builder 设计模式快速实现
13.消除代码冗长神器 - Lombok | @NonNull 判空逻辑
14.消除代码冗长神器 - Lombok | @SneakyThrows 检查型异常转抛
15.消除代码冗长神器 - Lombok | @Synchronized 锁
16.消除代码冗长神器 - Lombok | 试验性注解
17.消除代码冗长神器 - Lombok | 进阶用法 - 全局配置 & 去除Lombok
18.消除代码冗长神器 - Lombok | 高阶用法 -> 手写 @Getter 注解