/** * 第 4 章 · 函数与 Lambda — 综合示例 * * 涵盖: * - 单表达式函数 * - 默认参数 / 命名参数 * - vararg / spread (*) * - infix 中缀函数 * - 扩展函数 * - 高阶函数 + Lambda * - 闭包 * - inline 函数 */ // ========== 1. 默认参数 + 命名参数 ========== fun connect( host: String = "localhost", port: Int = 8080, timeout: Int = 5000, useTls: Boolean = false ) { println("Connecting → $host:$port (timeout=${timeout}ms, tls=$useTls)") } // ========== 2. 单表达式函数 ========== fun max(a: Int, b: Int) = if (a > b) a else b fun isAdult(age: Int) = age >= 18 // ========== 3. vararg ========== fun sum(vararg numbers: Int) = numbers.sum() // ========== 4. infix 中缀函数 ========== infix fun Int.repeatStr(s: String) = s.repeat(this) // ========== 5. 扩展函数 ========== fun String.toCamelCase(): String = this.split("_", "-", " ").joinToString("") { word -> word.replaceFirstChar { it.uppercase() } } fun List.average2(): Double = if (isEmpty()) 0.0 else sum().toDouble() / size // ========== 6. 高阶函数 ========== fun applyOperation(x: Int, y: Int, op: (Int, Int) -> Int): Int = op(x, y) inline fun retry(times: Int = 3, block: (attempt: Int) -> T): T { var lastError: Throwable? = null repeat(times) { attempt -> try { return block(attempt + 1) } catch (e: Exception) { lastError = e println(" ⚠️ 第 ${attempt + 1} 次失败: ${e.message}") } } throw lastError ?: IllegalStateException("retry exhausted") } // ========== 7. 闭包 ========== fun makeCounter(): () -> Int { var count = 0 return { count++ count } } // ========== main ========== fun main() { println("=== 1. 默认参数 + 命名参数 ===") connect() connect("example.com") connect(port = 9090) // 命名参数跳过 host connect(host = "example.com", useTls = true) // 顺序无所谓 println("\n=== 2. 单表达式函数 ===") println("max(3, 7) = ${max(3, 7)}") println("isAdult(20) = ${isAdult(20)}") println("\n=== 3. vararg ===") println("sum(1,2,3) = ${sum(1, 2, 3)}") val nums = intArrayOf(10, 20, 30) println("sum(*nums) = ${sum(*nums)}") // spread 展开 println("\n=== 4. infix 中缀 ===") println(3 repeatStr "Hi ") // "Hi Hi Hi " println("a" to 1) // Pair("a", 1),to 也是 infix println("\n=== 5. 扩展函数 ===") println("hello_kotlin_world".toCamelCase()) // "HelloKotlinWorld" println("my-app-name".toCamelCase()) // "MyAppName" println(listOf(1, 2, 3, 4, 5).average2()) // 3.0 println("\n=== 6. 高阶函数 + Lambda ===") println(applyOperation(5, 3) { a, b -> a + b }) // 8 (加法 lambda) println(applyOperation(5, 3) { a, b -> a * b }) // 15 (乘法 lambda) val sub: (Int, Int) -> Int = { a, b -> a - b } println(applyOperation(10, 4, sub)) // 6 println("\n=== 7. retry 高阶函数 ===") val result = retry(times = 5) { attempt -> if (attempt < 3) throw RuntimeException("假装失败") "✅ 成功!第 $attempt 次" } println(result) println("\n=== 8. 闭包:counter 记住 count 变量 ===") val counter = makeCounter() println(counter()) // 1 println(counter()) // 2 println(counter()) // 3 println("\n=== 9. 集合的高阶函数 ===") val list = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) println("偶数: ${list.filter { it % 2 == 0 }}") println("平方: ${list.map { it * it }}") println("总和: ${list.sum()}") println("第一个 > 5: ${list.first { it > 5 }}") println("分组奇偶: ${list.groupBy { if (it % 2 == 0) "偶" else "奇" }}") }