消除代码冗长神器 - Lombok | val/var 本地变量声明

2024-01-08 20:58:12

🤷 场景

一般来说,在 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

文章来源:https://blog.csdn.net/u012383839/article/details/135464575
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。