ZetCode

Java 未使用的变量 (_)

上次修改于 2025 年 5 月 28 日

本文介绍了如何使用下划线 (_) 来表示 Java 中未使用的变量。这是 Java 21 (JEP 443) 中引入的一项功能,旨在帮助开发人员显式忽略未使用的参数。

未使用变量简介

在 Java 中,我们经常遇到需要声明参数或变量,但实际上并不使用它们的情况。

传统上,开发人员会:

  1. 给这些变量赋予无意义的名称(如 unusedignore
  2. 抑制编译器/IDE 发出的 "unused variable" 警告

Java 21 引入了下划线 (_) 作为特殊标识符,用于标记有意未使用的变量。在其他语言中通常被称为“discard”,它通过显式表明该变量是不必要的,从而增强了代码的清晰度,从而产生更简洁和可读的语法。

基本语法

下划线可以在多个上下文中使用

// Lambda parameters
(param1, _) -> expression

// Pattern matching
if (obj instanceof String _) { ... }

// Exception handling
try { ... } catch (Exception _) { ... }

主要特点

Lambda 表达式

在 lambda 参数中使用 _ 允许我们忽略不需要的参数。这在函数式编程上下文中特别有用,因为我们可能只关心 lambda 表达式中的一个参数。

Main.java
void main() {

    Map<String, Integer> scores = Map.of("Alice", 90, "Bob", 85);
    
    // Only using the key, ignoring the value
    scores.forEach((name, _) -> System.out.println("Student: " + name));
    
    // Only using the value, ignoring the key
    scores.forEach((_, score) -> System.out.println("Score: " + score));
}

此示例演示了如何忽略 Map.forEach 操作中的键或值。

模式匹配

模式匹配允许我们以更简洁的方式匹配类型和结构。我们可以使用 _ 来忽略模式匹配中的值,当我们只关心类型或结构,而不关心实际值时,这可以使我们的代码更具可读性。

Main.java
void process(Object obj) {

    switch (obj) {
        case String _ -> System.out.println("It's a String");
        case Integer _ -> System.out.println("It's an Integer");
        case Double _ -> System.out.println("It's a Double");
        default -> System.out.println("Unknown type");
    }
}

void main() {

    process("Hello");
    process(42);
    process(3.14);
    process(new Object());
}

这里我们使用 _ 来匹配类型,而不将实际值绑定到变量。

异常处理

在异常处理中使用 _,当我们不需要异常对象时。

Main.java
void readFile() {

    try {

        // File reading operation that might fail
        String fileName = "words.txt";

        String content = Files.readString(Path.of(fileName));
        System.out.println(content);

    } catch (IOException _) {
        System.out.println("Error occurred while reading file");
        // Don't need the exception details
    }
}

void main() {

    readFile();
}

这显示了如何在不需要访问异常对象时处理异常。

记录模式

在使用记录进行模式匹配时,我们也可以使用 _ 来忽略我们不关心的字段。

Main.java
record Point(int x, int y) {}

void printX(Point p) {

    if (p instanceof Point(int x, _)) {
        System.out.println("X coordinate: " + x);
    }
}

void main() {

    printX(new Point(5, 10));
}

这里我们解构一个 Point 记录,但只关心 x 坐标。

最佳实践

何时使用 _

何时不使用 _

兼容性注意事项

关于兼容性的重要提示

来源

JEP 443:未命名的模式和变量

在本文中,我们探讨了 Java 的未命名变量模式 (_),这是一个简单但功能强大的功能,它通过显式标记未使用的变量,使代码更具可读性。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程