Java 11 新特性之 本地变量类型推断扩展

Java 11 对 本地变量类型推断(Local Variable Type Inference) 进行了扩展,这是对 Java 10 中引入的 ​​var​​​ 关键字功能的进一步增强。虽然 Java 11 并没有在语言层面增加新的语法,但它改进了 ​​var​​ 在某些场景下的使用方式,特别是与 Lambda 表达式结合时的行为。


什么是本地变量类型推断?

在 Java 10 中,​​var​​ 关键字被引入,允许开发者在声明局部变量时省略显式的类型声明,编译器会根据右侧表达式的类型自动推断出变量的类型。这使得代码更加简洁。

示例(Java 10):

ini 复制代码
// 使用显式类型
String name = "Alice";

// 使用 var 推断类型
var name = "Alice"; // 编译器推断为 String

虽然 ​​var​​ 的引入简化了代码,但在 Java 10 中,它不能直接用于 Lambda 表达式的参数。


Java 11 的扩展:Lambda 参数中的 ​​var​

Java 11 允许在 Lambda 表达式的参数中使用 ​​var​​,从而使代码更具一致性,尤其是在需要给 Lambda 参数添加注解或修改修饰符时非常有用。

示例:

scss 复制代码
// Java 10 中无法使用 var
(String s) -> s.length();

// Java 11 中可以使用 var
(var s) -> s.length();

解释:

  • ​(var s)​ 是合法的,编译器会推断出 ​s​ 的类型。
  • 使用 ​var​ 使得 Lambda 表达式的参数声明风格与其他地方的变量声明保持一致。

为什么需要在 Lambda 参数中使用 ​​var​​?

  1. 支持注解 : 如果你需要在 Lambda 参数上添加注解(例如 ​@NonNull​),使用 ​var​ 是唯一的选择。

示例:

ini 复制代码
import org.jetbrains.annotations.NotNull;

(var s) -> {
    @NotNull var result = s.toUpperCase();
    return result;
};
  1. 统一代码风格 : 在复杂的 Lambda 表达式中,使用 ​var​ 可以使代码风格更加统一,避免显式类型声明带来的冗长。
  2. 未来兼容性 : 随着 Java 的不断发展,​var​ 的使用范围可能会进一步扩展。提前适应这种风格有助于未来的代码迁移。

限制和注意事项

  1. 不能混合使用显式类型和 ​var​: 在 Lambda 表达式中,所有参数要么都使用显式类型,要么都使用 ​var​,不能混用。

错误示例:

javascript 复制代码
(String s, var t) -> s + t; // 编译错误
  1. 不能省略括号 : 即使只有一个参数,如果使用了 ​var​,括号也不能省略。

正确示例:

scss 复制代码
(var s) -> s.length(); // 必须加括号
  1. 不适用于方法引用 : 方法引用中不能使用 ​var​

错误示例:

javascript 复制代码
Function<String, Integer> func = (var s) -> s.length(); // 正确
Function<String, Integer> func = String::length;        // 正确
Function<var, Integer> func = String::length;          // 编译错误

实际应用示例

以下是一些实际使用场景,展示了 ​​var​​ 在 Lambda 表达式中的作用:

示例 1:带注解的 Lambda 参数

ini 复制代码
import org.jetbrains.annotations.NotNull;

(var s) -> {
    @NotNull var upper = s.toUpperCase();
    System.out.println(upper);
};

示例 2:多参数 Lambda 表达式

css 复制代码
(var a, var b) -> a + b;

示例 3:复杂逻辑的 Lambda 表达式

csharp 复制代码
(var input) -> {
    if (input == null) {
        throw new IllegalArgumentException("Input cannot be null");
    }
    return input.length();
};

总结

Java 11 对 ​​var​​ 的扩展使得它可以在 Lambda 表达式的参数中使用,从而增强了代码的灵活性和一致性。尽管这一特性在大多数情况下并不是必需的,但在需要添加注解或希望保持代码风格统一的情况下,它是非常有用的。

相关推荐
超浪的晨2 小时前
Java 实现 B/S 架构详解:从基础到实战,彻底掌握浏览器/服务器编程
java·开发语言·后端·学习·个人开发
追逐时光者3 小时前
一款超级经典复古的 Windows 9x 主题风格 Avalonia UI 控件库,满满的回忆杀!
后端·.net
Python涛哥4 小时前
go语言基础教程:【1】基础语法:变量
开发语言·后端·golang
我命由我123454 小时前
PostgreSQL 保留关键字冲突问题:语法错误 在 “user“ 或附近的 LINE 1: CREATE TABLE user
数据库·后端·sql·mysql·postgresql·问题·数据库系统
LUCIAZZZ5 小时前
final修饰符不可变的底层
java·开发语言·spring boot·后端·spring·操作系统
wsj__WSJ5 小时前
Spring Boot 请求参数绑定:全面解析常用注解及最佳实践
java·spring boot·后端
CodeUp.6 小时前
SpringBoot航空订票系统的设计与实现
java·spring boot·后端
码事漫谈6 小时前
Linux下使用VSCode配置GCC环境与调试指南
后端
求知摆渡6 小时前
RocketMQ 从二进制到 Docker 完整部署(含 Dashboard)
运维·后端