闪电疯狂赛车
91.44M · 2026-03-23
大家好,我是大华。
写 Java 这么多年,我以前是几乎不用 var 这个关键字的。看到 var 下意识就会联想到 JavaScript,这种类型模糊、不受控制的感觉,让人很不放心。
Java 的 var 是 Java10 引入的局部变量类型推断,只能用在方法内部,编译期就能确定类型,本质还是强类型语言。
最常见的写法差异,可以看看下面这个对比。
不用 var:
Map<String, List<CustomerRecord>> customersByRegion = new HashMap<>();
使用 var:
var customersByRegion = new HashMap<String, List<CustomerRecord>>();
类型并没有消失,只是从左边挪到了右边,而且右边往往写得更完整、更直观。
以前写 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>,更多是形式上的完整,而不是信息上的必要。
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 不是为了省几个字符,而是为了减少重复的代码。如果觉得代码不好理解,那还是需要老老实实的把类型写完整。