《Java 8-21 高频特性实战(下):新特性落地指南》
六、场景 6:字符串处理(Java 11+ 新增实用方法)
特性说明
Java 11 及以上版本给 String 类新增了 isBlank()、strip()、lines() 等方法,解决了传统字符串处理 "空格判断繁琐、换行符分割复杂" 的问题。
问题场景
判断字符串是否为 "空白(含全空格)"、去除字符串首尾空格(含全角空格)、按换行符分割字符串。
实战代码
java
public class StringMethodDemo {
public static void main(String[] args) {
String blankStr = " "; // 全空格字符串
String fullWidthBlank = " Java 字符串 "; // 含全角空格
String multiLineStr = "第一行\n第二行\r第三行\r\n第四行"; // 混合换行符
// 1. 判断是否为空白(空白=null/空字符串/全空格)
System.out.println("blankStr 是否空白:" + blankStr.isBlank()); // 输出:true
System.out.println("\"\" 是否空白:" + "".isBlank()); // 输出:true
System.out.println("\"abc\" 是否空白:" + "abc".isBlank()); // 输出:false
// 2. 去除首尾空格(支持全角空格,区别于 trim())
String stripped = fullWidthBlank.strip();
System.out.println("去除全角空格后:" + stripped); // 输出:Java 字符串
// 3. 按换行符分割(自动处理 \n、\r、\r\n)
multiLineStr.lines().forEach(line -> System.out.println("分割后行:" + line));
// 输出:
// 分割后行:第一行
// 分割后行:第二行
// 分割后行:第三行
// 分割后行:第四行
// 4. 重复字符串(Java 11+)
String repeated = "Java".repeat(3);
System.out.println("重复3次:" + repeated); // 输出:JavaJavaJava
}
}
核心亮点
isBlank():比isEmpty()更实用(isEmpty()不识别全空格字符串);strip():支持全角空格(trim()仅支持半角空格);lines():自动兼容所有换行符(\n/\r/\r\n),无需手动写正则分割。
七、场景 7:集合工厂方法(Java 9+ 简化集合创建)
特性说明
Java 9 引入 List.of()、Set.of()、Map.of() 静态工厂方法,无需手动 new ArrayList<>() 再添加元素,直接创建不可变集合(线程安全),代码更简洁。
问题场景
创建 "固定元素的集合"(如状态列表、字典映射),传统写法需 3 行代码,工厂方法 1 行搞定。
实战代码
java
import java.util.List;
import java.util.Map;
import java.util.Set;
public class CollectionFactoryDemo {
public static void main(String[] args) {
// 1. 创建不可变 List(元素不可添加/删除/修改)
List<String> statusList = List.of("待支付", "已支付", "已发货", "已完成");
System.out.println("订单状态列表:" + statusList); // 输出:[待支付, 已支付, 已发货, 已完成]
// 2. 创建不可变 Set(自动去重)
Set<String> tagSet = Set.of("Java", "Spring", "Redis", "Java"); // 重复元素编译报错
System.out.println("技术标签集合:" + tagSet); // 输出:[Java, Spring, Redis]
// 3. 创建不可变 Map(最多支持 10 个键值对,超过可使用 Map.ofEntries())
Map<String, String> dictMap = Map.of(
"001", "北京",
"002", "上海",
"003", "广州"
);
System.out.println("城市字典:" + dictMap); // 输出:{001=北京, 002=上海, 003=广州}
// 4. 不可变集合特性:尝试修改会抛出 UnsupportedOperationException
// statusList.add("已取消"); // 编译通过,运行时报错
}
}
核心亮点
- 简洁高效:1 行代码创建集合,替代传统 "创建 + add" 多步操作;
- 线程安全:不可变集合无并发修改风险,无需额外同步;
- 自动校验:
Set.of()禁止重复元素,Map.of()禁止重复键,编译时校验。
八、场景 8:try-with-resources 增强(Java 9+ 简化资源关闭)
特性说明
Java 9 优化了 try-with-resources 语法,允许将 "已声明的资源变量" 直接传入 try 括号中,无需在括号内重新声明,代码更简洁。
问题场景
读取文件 / 数据库连接等资源时,传统 try-with-resources 需在括号内声明资源,Java 9+ 可直接使用外部已声明的资源变量。
实战代码
java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class TryWithResourcesDemo {
public static void main(String[] args) throws IOException {
// 1. 外部声明资源变量(Java 9+ 支持直接传入 try 括号)
BufferedReader reader = new BufferedReader(new FileReader("test.txt"));
// 2. try-with-resources 直接使用外部资源(自动关闭,无需手动 close())
try (reader) { // 无需重新声明:BufferedReader reader = ...
String line;
while ((line = reader.readLine()) != null) {
System.out.println("文件内容:" + line);
}
} catch (IOException e) {
System.out.println("文件读取异常:" + e.getMessage());
}
// 3. 资源已自动关闭,无需手动调用 reader.close()
}
}
核心亮点
- 代码简化:避免资源变量重复声明,尤其适合 "资源创建逻辑复杂" 的场景;
- 自动关闭:所有实现
AutoCloseable接口的资源(文件、流、数据库连接)均可自动关闭,杜绝资源泄漏; - 兼容性:向下兼容 Java 8 的语法,可混合使用。
九、场景 9:模式匹配(Java 14+ 简化类型判断与转换)
特性说明
Java 14 引入 "模式匹配 instanceof",Java 16 正式转正,允许在 instanceof 判断后直接声明变量,避免手动强制类型转换,减少代码冗余和错误。
问题场景
判断对象类型后进行强制转换(如判断 Object 是否为 String/Integer),传统写法需 2 行代码,模式匹配 1 行搞定。
实战代码
java
public class PatternMatchingDemo {
public static void main(String[] args) {
Object obj1 = "Java 模式匹配";
Object obj2 = 2025;
Object obj3 = 3.14;
printObjectType(obj1);
printObjectType(obj2);
printObjectType(obj3);
}
// 模式匹配 instanceof:判断+转换一步完成
private static void printObjectType(Object obj) {
if (obj instanceof String str) { // 直接声明变量 str,无需手动转换
System.out.println("类型:字符串,内容:" + str + ",长度:" + str.length());
} else if (obj instanceof Integer num) { // 声明变量 num
System.out.println("类型:整数,值:" + num + ",平方:" + num * num);
} else if (obj instanceof Double d) { // 声明变量 d
System.out.println("类型:浮点数,值:" + d + ",整数部分:" + d.intValue());
} else {
System.out.println("未知类型:" + obj.getClass().getName());
}
}
}
核心亮点
- 简化代码:
instanceof判断与类型转换合并为一行,避免 "重复变量名 + 强制转换"; - 类型安全:变量仅在
if分支内有效,避免外部误使用; - 可读性:逻辑更清晰,减少 "模板代码",聚焦业务逻辑。
十、场景 10:文本块(Java 15+ 简化多行字符串)
特性说明
Java 15 引入文本块(Text Blocks),用 """ 包裹多行字符串,无需手动添加 \n/\t 转义字符,支持直接换行和缩进,尤其适合 HTML、JSON、SQL 等多行文本。
问题场景
定义多行 SQL 语句或 JSON 字符串,传统写法需拼接 \n 和引号,代码混乱且易出错。
实战代码
java
public class TextBlockDemo {
public static void main(String[] args) {
// 1. 多行 SQL 语句(无需转义,直接换行)
String sql = """
SELECT id, name, age
FROM user
WHERE age > 18
ORDER BY create_time DESC;
""";
System.out.println("SQL 语句:" + sql);
// 2. 多行 JSON 字符串(格式清晰,无拼接错误)
String json = """
{
"name": "Java 文本块",
"version": "15+",
"features": [
"无需转义",
"直接换行",
"支持缩进"
]
}
""";
System.out.println("JSON 字符串:" + json);
}
}
核心亮点
- 格式清晰:多行文本直接按原始格式编写,无需
\n/\t转义; - 减少错误:避免字符串拼接导致的引号不匹配、转义字符遗漏问题;
- 适配场景:HTML、XML、SQL、JSON 等多行文本场景均可使用,大幅提升代码可读性。
总结:Java 版本特性学习建议
- 优先掌握高频特性:Lambda+Stream、Optional、LocalDateTime(Java 8)是工作中最常用的,必须熟练;
- 跟进实用新特性:虚拟线程(Java 21)、模式匹配(Java 16)、文本块(Java 15)能显著提升开发效率,适合项目升级后使用;
- 代码实战优先:所有特性均通过 "场景 + 代码" 落地,避免只记概念不写代码;
- 兼容性考虑:若项目仍使用 Java 8,可优先掌握前 4 个场景;若已升级到 Java 11+,可逐步引入集合工厂、字符串新方法等。