沉默是金,总会发光 大家好,我是沉默
如果你也是从 public static void main(String[] args) 和 System.out.println() 开始 Java 生涯的,那八成已经是“老 Java 人”了。
上班这些年,我们每天都在写业务代码: CRUD、DTO、Service、Mapper……
代码能跑、需求能交,但也常忍不住吐槽一句: Java 是不是有点笨? 写点事,咋这么多样板代码?
但真相是—— 笨的不是 Java,而是我们还在用旧姿势写新 Java。
从 Java 8 到今天的 Java 21/25,Java 一直在进化: 语法在变、抽象在升级、写法在变轻。
下面这几个技巧,都是我在真实项目里反复用、越用越香的东西。 来看看,你用过几个。
-01- 1-2 ① 用枚举(Enum)干点正事,而不是只当常量很多人对枚举的理解还停在: MALE, FEMALE
但实际上,枚举=自带多态的轻量策略类。
比如:会员等级折扣。 与其写一堆 if-else / switch,不如直接让逻辑“住”进枚举里。 public enum MemberType { REGULAR { @Override public double applyDiscount(double price) { return price * 0.98; } }, VIP { @Override public double applyDiscount(double price) { return price * 0.9; } }, PREMIUM { @Override public double applyDiscount(double price) { return price * 0.8; } }; public abstract double applyDiscount(double price);}
使用时非常干净: double finalPrice = MemberType.VIP.applyDiscount(100);
没有 if 没有 switch 新增会员 ≈ 新增一个枚举值 这就是最符合开闭原则的业务写法之一。
② 用 Record,砍掉 80% DTO 垃圾代码以前写一个 DTO 是什么体验? - private final 字段
- getter
- equals
- hashCode
- toString
要么手写,要么全靠 Lombok。
现在?一句话。 public record UserProfile(String username, String email) {}
直接用: UserProfile user = new UserProfile("dev_user", "user@example.com");System.out.println(user.username());System.out.println(user);
不可变 语义清晰 编译期生成完整方法
-02- 3-4 ③ 给 ID 穿一层“类型外衣”,让编译器帮你查 Bug如果你写过这种方法: void process(Long userId, Long orderId)
那你一定也踩过这种坑: process(orderId, userId); // 编译通过,逻辑反天了
解决方案很简单: 让 ID 拥有自己的类型。 public record UserId(long value) {}public record OrderId(long value) {}
void process(UserId userId, OrderId orderId) {}
现在如果你传反了? 直接编译失败 这就是: 把线上问题,提前杀死在 IDE 里。
④ Stream 清晰表达业务意图需求: 从产品列表里 找到价格 > 500 的 返回名字
传统写法:循环 + if + list。
Stream 写法: List<String> result = products.stream() .filter(p -> p.price() > 500) .map(Product::name) .toList();
业务意图一眼可读 没有临时变量 天然支持并行与组合 你不再描述“怎么做”,而是在描述“要什么”。
-03- 5-7 ⑤ 文本块(Text Block):终于能轻松写字符串了以前在 Java 里写 JSON / SQL,像在拆炸弹: "{\n" +" \"name\": \"Alice\",\n" +" \"age\": 30\n" +"}";
现在: String json = """{ "name": "Alice", "age": 30}""";
所见即所得 没有转义符 可读性直接拉满 写 SQL、模板、JSON 的幸福感,瞬间 +100。
⑥ Optional :不是替代 null,而是表达“可能不存在”Optional 的价值不在于“少写 if”, 而在于 语义强约束: 这个方法,可能没有值。
repo.findUserNameById(id) .ifPresentOrElse( name -> System.out.println("找到用户:" + name), () -> System.out.println("用户不存在") );
强制调用方思考空值 链式表达业务分支 极大降低 NPE 风险
⑦ 新语法再香,前提是:你得能随时切 Java 版本说句大实话: - 老系统:Java 8
- 新项目:Java 17 / 21
- 自己学习:Java 25
本地要不停切 JDK,真的会心态爆炸。 这时候,我强烈推荐一个工具:ServBay。 它最大的价值就一件事: 帮你无痛管理多个 Java 版本
- Java 8 / 11 / 17 / 21 并存
- 项目级指定 JDK
- 完全隔离,互不污染
你不再折腾环境变量, 而是专心写代码、玩新特性。
-04- 总结 Java 一直未老 老的是我们写 Java 的方式 当你开始: - 用 Enum 代替 if
- 用 Record 消灭 DTO
- 用类型约束代替约定
- 用 Stream 表达意图
你会发现: Java,其实一直都挺优雅。
你还有哪些“私藏”的 Java 神仙写法? 欢迎在评论区一起交流...
-05- 粉丝福利 我这里创建一个程序员成长&副业交流群,和一群志同道合的小伙伴,一起聚焦自身发展,可以聊:技术成长与职业规划,分享路线图、面试经验和效率工具,探讨多种副业变现路径,从写作课程到私活接单,主题活动、打卡挑战和项目组队,让志同道合的伙伴互帮互助、共同进步。如果你对这个特别的群,感兴趣的,可以加一下,微信通过后会拉你入群,但是任何人在群里打任何广告,都会被我T掉。
查看详情:https://www.toutiao.com/article/7584388605175480874 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |