var用于局部变量声明时应初始化且类型明确,适用于泛型集合、stream链式调用等场景;避免用于基础类型歧义处,命名需补足语义;lambda中可用var但须统一。

用 var 简化局部变量声明,核心是“让编译器推类型、人专注表达意图”,不是盲目删类型。关键在选对场景、避开模糊地带、保持一眼可知的语义。
只在初始化时用 var,且右值类型必须清晰
编译器靠赋值表达式的字面量或构造器推断类型,所以必须初始化,且不能是 null 或泛型擦除后无法确定的调用。
- ✅ 推断明确:
var names = new ArrayList<string>();</string>→ArrayList<string></string> - ✅ 字面量直接:
var title = "Dashboard";→String;var count = 100L;→long - ❌ 无初始化:
var flag;→ 编译失败 - ❌ null 初始化:
var user = null;→ 编译失败(类型不可知) - ❌ 擦除干扰:
var list = getList();(若getList()返回List无泛型)→ 推断为List<object></object>或报错,不安全
优先用于泛型长类型、流操作和构造器链
这些地方显式写类型既冗长又分散注意力,用 var 反而更干净、重点更突出。
- 泛型集合:
var cache = new ConcurrentHashMap<string completablefuture>>();</string> - Stream 链式结果:
var topUsers = users.stream().filter(...).limit(10).collect(Collectors.toList()); - Builder 模式:
var config = new DatabaseConfig.Builder().host("db").port(5432).build();
避免在基础类型和易歧义处滥用
当类型信息本身承载重要语义时,显式写出反而提升可读性。
- ❌ 不推荐:
var timeout = 30;—— 是秒?毫秒?int 还是 long?不如写int timeoutSeconds = 30; - ❌ 含糊数值:
var rate = 0.95;—— double?float?业务上是否允许精度损失?建议写double discountRate = 0.95; - ✅ 可接受但需命名补足:
var maxRetries = 3;—— 只要变量名带单位或语义,就足够清晰
lambda 参数中也可用 var(Java 11+)
在函数式接口参数明确的上下文中,var 能统一风格,尤其适合多参数 lambda。
- ✅ 清晰简洁:
list.forEach((var item) -> System.out.println(item.getName())); - ✅ 多参数支持:
map.entrySet().stream().filter((var e) -> e.getValue() > 100).forEach(...); - ⚠️ 注意:不能混用,如
(String k, var v)是非法的;要么全显式,要么全用var










