写 Java 这么多年,我为什么推荐在 Stream 和 try-with-resources 中使用 var?

AI 概述
Java10 引入局部变量类型推断关键字var,它只能在方法内部使用,编译期确定类型,本质仍是强类型语言。在基础泛型声明、Stream、链式调用加中间变量、try-with-resources等场景中,使用var能让代码更紧凑,将注意力聚焦在关键逻辑上,且重构友好,修改方法返回类型时变量声明行可能无需改动。不过,使用var也有禁忌,如没有初始化的变量、类型不直观的情况不应用,其目的是减少重复代码,若影响理解则应写完整类型。
目录
文章目录隐藏
  1. 基础泛型声明
  2. Stream 场景,对比最明显
  3. 链式调用 + 中间变量
  4. try-with-resources 场景
  5. 重构友好这一点,真的很实用
  6. 什么时候我不会用 var

写 Java 这么多年,我为什么推荐在 Stream 和 try-with-resources 中使用 var?

写 Java 这么多年,我以前是几乎不用 var 这个关键字的。看到 var 下意识就会联想到 JavaScript。

Java 的 var 是 Java10 引入的局部变量类型推断,只能用在方法内部,编译期就能确定类型,本质还是强类型语言。

最常见的写法差异,可以看看下面这个对比。

基础泛型声明

不用 var:

Map<String, List<CustomerRecord>> customersByRegion = new HashMap<>();

使用 var:

var customersByRegion = new HashMap<String, List<CustomerRecord>>();

类型并没有消失,只是从左边挪到了右边,而且右边往往写得更完整、更直观。

Stream 场景,对比最明显

以前写 Stream,经常是这样:

Map<Long, List<OrderItemDTO>> orderItemMap = orderList.stream()
                 .filter(item -> item.getPrice() > 0)
                 .collect(Collectors.groupingBy(OrderItemDTO::getOrderId));

逻辑本身并不复杂,但左边那一串类型,其实对理解代码帮助不大。

换成 var:

var orderItemMap = orderList.stream()
                 .filter(item -> item.getPrice() > 0)
                 .collect(Collectors.groupingBy(OrderItemDTO::getOrderId));

阅读代码的时候,注意力会自然的落在 filter 和 groupingBy 在做什么,而不是在解析泛型结构。

链式调用 + 中间变量

再看一个业务代码场景。

不用 var:

Optional<UserProfileDTO> userProfileOptional =
        userService.getUser(userId)
                   .flatMap(user -> profileService.getProfile(user));

使用 var:

var userProfileOptional =
        userService.getUser(userId)
                   .flatMap(user -> profileService.getProfile(user));

这种情况下,变量的语义已经由方法名决定了,重复写一遍 Optional<UserProfileDTO>,更多是形式上的完整,而不是信息上的必要。

try-with-resources 场景

var 在资源管理里也很好用,尤其是 IO、数据库相关代码。

try (var inputStream = new FileInputStream(file);
     var reader = new BufferedReader(new InputStreamReader(inputStream))) {

    return reader.readLine();
}

类型清晰、代码紧凑,而且完全不影响可读性。

重构友好这一点,真的很实用

假设原来是这样:

List<UserDTO> users = userService.getUsers();

后来需求变了,返回值改成:

List<UserVO>

不用 var 的情况下,你要改这里:

List<UserVO> users = userService.getUsers();

用 var 的情况下:

var users = userService.getUsers();

你只需要改方法返回类型,变量声明这一行甚至不用动,这在大项目里非常舒服。

什么时候我不会用 var

我自己给自己定了几个禁用规则:

// 不允许:没有初始化
var count;

// 不推荐:类型不直观
var result = service.process(a, b, c);

// 推荐:类型一眼可见
var list = new ArrayList<UserDTO>();
var map = new HashMap<String, Integer>();

var 不是为了省几个字符,而是为了减少重复的代码。如果觉得代码不好理解,那还是需要老老实实的把类型写完整。

以上关于写 Java 这么多年,我为什么推荐在 Stream 和 try-with-resources 中使用 var?的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

1

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 写 Java 这么多年,我为什么推荐在 Stream 和 try-with-resources 中使用 var?

发表回复