项目
博客
归档
资源链接
关于我
项目
博客
归档
资源链接
关于我
拒绝臃肿:用 60 行 Groovy 代码写出 Java 600 行的业务体感
2025-07-25
·
·
原创
·
其他
·
本文共 469个字,预计阅读需要 2分钟。
> 一行胜千言”的脚本魔法,把 POJO、HTTP、JSON、集合、日期、MD5、元编程一次性拉通 --- ## ① 从 Map 到 POJO —— 5 秒建模 ```groovy // 1. 直接用 Map 当对象,还能存闭包 def user = [name: "xx", age: 20, hello: { "hello $it" }] println user.hello("你好") // → hello 你好 // 2. Map → Java Bean 一键强转 class User { String name; int age; String sex } def user2 = [name: "招安", age: 20, sex: "男"] as User println user2.sex // → 男 ``` --- ## ② Mock 接口不求人 —— 3 行造一个 `HttpServletRequest` ```groovy HttpServletRequest request = [ getMethod: { "GET" }, getServletPath: { "/hello" } ] as HttpServletRequest println request.method // → GET ``` --- ## ③ 手写 JSON —— 模板字符串即所得 ```groovy String name = "王五"; Integer age = 28; String sex = "女" def json = """ { "name": "$name", "age": "$age", "sex": "$sex" } """ println json ``` --- ## ④ 集合切片与合并 —— Groovy “刀法” ```groovy def list = 0..100 // Range 自动展开 println list[0..<5] // [0, 1, 2, 3, 4] println list[5..-1] // [5, 6, ..., 100] // Map 的加减法 def map1 = [name: "张三", sex: "女"] def map2 = [doing: "工作", study: "ok"] map1 += map2 // 合并 println map1 // [name:张三, sex:女, doing:工作, study:ok] map1 -= map2 // 差集 println map1 // [name:张三, sex:女] ``` --- ## ⑤ 一行构造 + 字符串乘法 ```groovy class Server { String host; int port } def s = new Server(host: '127.0.0.1', port: 8080) println "$s.host:$s.port" // → 127.0.0.1:8080 println "h" * 10 // → hhhhhhhhhh ``` --- ## ⑥ 元编程 —— 给 `String` 当场添加 MD5 ```groovy String.metaClass.md5 = { -> MessageDigest.getInstance("MD5") .digest(delegate.bytes) .collect { "%02x".format(it) }.join() } println "hello".md5() // → 5d41402abc4b2a76b9719d911017c592 ``` --- ## ⑦ 日期运算 & 安全导航 ```groovy use(groovy.time.TimeCategory) { println new Date() + 7.hours // 7 小时后 } def person = [address: [city: 'Shanghai']] println person?.address?.city // Shanghai println person?.address?.street // null(无 NPE) ``` --- ## ⑧ 集合 GPath —— 秒算总分 ```groovy def list3 = [[name: 'A', score: 90], [name: 'B', score: 80]] println list3.name // ['A', 'B'] println list3*.score.sum() // 170 ``` --- ## ⑨ 循环 & 控制流 —— 像伪代码一样写 ```groovy // while 倒计数 def n = 3; while (n--) println n // 2 1 0 // range / list / map 遍历 for (i in 0..4) println i // 0 1 2 3 4 ['a', 'b'].each { println it } // a b [x: 1, y: 2].each { k, v -> println "$k=$v" } // x=1 y=2 // switch 任意类型 switch (3.14) { case 0..1: println '0-1'; break case [2, 3, 4]: println '2-3-4'; break default: println 'other' } ``` --- ## ⑩ 速查表:记住这 10 个符号,少写 90% 样板 | 场景 | Groovy 速写 | | ---------- | ------------------ | | 创建 List | `[1, 2, 3]` | | 创建 Map | `[k: 'v']` | | 空值兜底 | `foo ?: 'default'` | | 链式安全 | `obj?.a?.b` | | 追加元素 | `list << item` | | 闭包 | `{ it * 2 }` | | Range 循环 | `for (i in 0..9)` | | 字符串插值 | `"Hello, $name"` | | 正则 | `str =~ /pattern/` | | 动态对象 | `new Expando()` | --- ## 结语 60 行脚本覆盖 **Bean 映射、Mock、JSON、集合运算、日期、加密、元编程、循环控制**—— Groovy 把 Java 的“仪式感”压缩成了“一句话”的爽快。 下次业务 PoC、单元测试、运维脚本,不妨打开 `.groovy` 文件,体验 **“代码行数 –90%”** 的快乐。