共计 2560 个字符,预计需要花费 7 分钟才能阅读完成。
引言
Java 开发中常遇到重复造轮子、代码冗长、性能瓶颈等问题。比如手动处理集合的嵌套循环、判空防御代码占 1 / 3 逻辑、同步方法滥用等。以下 10 个技能能帮我们减少至少 30% 的样板代码。

核心技能
1. Stream API 的链式处理
// 传统方式
List<String> filteredNames = new ArrayList<>();
for (User user : users) {if (user.getAge() > 18) {filteredNames.add(user.getName());
}
}
// Stream 方式
List<String> filteredNames = users.stream()
.filter(user -> user.getAge() > 18)
.map(User::getName)
.collect(Collectors.toList());
– 注意:并行流 (parallelStream) 需数据量 >1 万条才有收益
2. Optional 解决 NPE 噩梦
// 危险写法
String city = user.getAddress().getCity(); // 连环 NullPointerException
// 安全写法
String city = Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.orElse("默认城市");
– 不要用 Optional.isPresent()替代 if 判空(代码异味)
3. Lambda 与方法引用
// 冗余 Lambda
users.forEach(user -> System.out.println(user));
// 优化版
users.forEach(System.out::println);
– 方法引用使意图更清晰,但复杂逻辑仍需完整 Lambda
4. 记录类 (Record) 替代 POJO
// 传统 JavaBean
public class User {
private String name;
private int age;
// 10+ 行 getter/setter...
}
// Java14+ 记录类
public record User(String name, int age) {}
– 自动生成 equals/hashCode/toString
– 适合 DTO、值对象等场景
5. 新的 switch 表达式
// 旧版 switch
String typeName;
switch (type) {
case 1: typeName = "A"; break;
case 2: typeName = "B"; break;
default: throw new IllegalStateException();}
// Java12+ 新版
String typeName = switch (type) {
case 1 -> "A";
case 2 -> "B";
default -> throw new IllegalStateException();};
– 支持返回值、模式匹配(Java17+)
6. try-with-resources 优化
// 传统 try-catch-finally
BufferedReader br = null;
try {br = new BufferedReader(new FileReader(path));
// 使用资源...
} finally {if (br != null) br.close();}
// 自动关闭写法
try (BufferedReader br = new BufferedReader(new FileReader(path))) {// 自动调用 close()
}
– 实现 AutoCloseable 的类均可使用
7. 集合工厂方法
// 旧版初始化
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
// Java9+ 工厂方法
List<String> list = List.of("A", "B");
Set<String> set = Set.of("A", "B");
Map<String, Integer> map = Map.of("A", 1, "B", 2);
– 生成的集合不可变(线程安全)
– 超过 10 个元素用 Map.ofEntries()
8. 字符串模板(Java21 预览)
// 传统拼接
String msg = "Hello" + name + ", your score is" + score;
// Java21 字符串模板
String msg = STR."Hello \{name}, your score is \{score}";
– 需启用 –enable-preview
– 比 String.format()性能更好
9. CompletableFuture 异步编排
CompletableFuture.supplyAsync(() -> fetchOrder())
.thenApply(order -> processPayment(order))
.thenAccept(result -> sendNotification(result))
.exceptionally(ex -> {log.error("流程异常", ex);
return null;
});
– 替代 Callback 地狱
– 注意线程池配置
10. 本地变量类型推断
// 显式类型声明
Map<String, List<Pair<Integer, String>>> map = new HashMap<>();
// Java10+ 类型推断
var map = new HashMap<String, List<Pair<Integer, String>>>();
– 保留编译时类型检查
– 不宜滥用(降低可读性)
性能考量
- Stream 并行处理:小数据集反而更慢(线程切换开销)
- Optional 链:每个 map()调用创建新对象,超长链考虑 if-return
- 记录类:比传统 POJO 节省内存(无额外方法表)
- 不可变集合:防御性复制场景性能更优
避坑指南
- ❌ Stream.forEach()里修改外部变量(违反函数式原则)
- ❌ Optional.of(null)(应使用 ofNullable)
- ❌ 在 Lambda 中修改非 final 变量
- ❌ 用 var 声明接口类型(应保留实现类型信息)
总结
这些技能共同特点是:减少样板代码、利用编译器检查、遵循不可变原则。思考题:你的项目中有哪些代码可以用记录类重构?
正文完
