JDK-11 | 我为什么越来越喜欢用 Java 的 String/Collection 新 API
这是专栏第 11 篇。这一篇我不讲单一语法点,而是讲一组“每天都能用到”的 API 升级。这些能力看起来分散,但我在项目里落地后有一个共同收益:样板代码更少、边界更清晰、代码审查效率更高。一、JDK 8 时代的高频样板代码问题在 JDK 8 项目里,我经常会看到这些重复模式:字符串判空要trim().isEmpty()组合;去首尾空白写法不统一(尤其 Unicode 空白);快速构造只读集合要Collections.unmodifiableXxx(...);为了不可变快照还要额外复制一遍集合。这些代码不是难,而是“太多、太碎、太容易风格不一致”。二、版本信息(关键节点)常用能力大致分布在 Java 9/10/11:Java 9:List.of/Set.of/Map.ofJava 10:copyOf(集合不可变快照)Java 11:String.isBlank/strip/lines/repeat我在生产里通常以 JDK 17/21 为落地基线,一次性吃到这批能力。三、这组 API 到底解决了什么1. 让“意图”直接写在代码里比如“我要不可变集合”可以直接List.of(...),不再绕多层包装。2. 减少工具类噪音以前要依赖各种StringUtils做基础操作,现在很多场景 JDK 原生就够了。3. 边界行为更统一例如isBlank和strip对 Unicode 空白处理更一致,减少隐性 bug。四、适配场景 / 不适配场景适配场景:代码库历史包袱重,字符串和集合写法风格分散;需要快速推广不可变集合,降低共享可变状态风险;希望减少第三方工具类依赖。不适配场景:强依赖可变集合但误用了of/copyOf;旧接口必须接收null元素(of系列不允许);团队未统一不可变集合的异常处理习惯。五、从 JDK 8 升级时,我会重点看这 8 件事1)isBlank与旧判空语义isBlank()会把全空白字符串判为空白。如果你旧逻辑只关心长度,要确认语义是否一致。2)strip与trim差异strip()基于 Unicode 空白,trim()不是。国际化文本处理里这个差异很关键。3)List.of不允许null迁移时如果数据可能含null,会直接抛NullPointerException,要先清洗数据。4) 不可变集合修改异常of/copyOf返回不可变集合,后续add/remove会抛UnsupportedOperationException。这不是 bug,是语义边界。5)copyOf的快照语义copyOf适合做防御性复制,减少外部修改影响。迁移时要明确“是共享引用还是不可变快照”。6) API 替换策略不