Lambda表达式是一种简洁的方式来定义匿名函数。Kotlin的Lambda表达式非常灵活,常用于函数式编程、集合操作、高阶函数等场景。
格式:{函数体}
调用:{函数体}()
val greet = { println("Hello, Kotlin!") }
greet() // 输出: Hello, Kotlin!
格式:{参数名:参数类型,参数名:参数类型… -> 函数体}
调用:{参数名:参数类型,参数名:参数类型… -> 函数体}(参数1,参数2…)
val sum = { a: Int, b: Int -> a + b }
println(sum(2, 3)) // 输出: 5
val str = {
println("Lambda返回值")
"今天天气真好"
}()
println("$str")
当 Lambda 表达式是函数的最后一个参数时,可以将其放在括号外面:
fun processNumbers(numbers: List<Int>, action: (Int) -> Unit) {
for (number in numbers) {
action(number)
}
}
fun main() {
val numbers = listOf(1, 2, 3, 4, 5)
// 常规调用方式
processNumbers(numbers, { number -> println(number) })
// Lambda 在括号外的简化写法
processNumbers(numbers) { number -> println(number) }
// 使用 it 简化单参数 Lambda
processNumbers(numbers) { println(it) }
}
如果函数只有一个 Lambda 参数,可以完全省略括号:
fun execute(action: () -> Unit) {
action()
}
fun main() {
execute { println("Hello from Lambda!") }
}
Lambda 作为参数的高阶函数示例:
fun List.filterOnCondition(condition: (Int) -> Boolean): List {
val result = mutableListOf()
for (item in this) {
if (condition(item)) {
result.add(item)
}
}
return result
}
fun main() {
val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// 过滤偶数
val evens = numbers.filterOnCondition { it % 2 == 0 }
println(evens) // [2, 4, 6, 8, 10]
// 过滤大于5的数
val greaterThan5 = numbers.filterOnCondition { it > 5 }
println(greaterThan5) // [6, 7, 8, 9, 10]
}
fun createGreeter(greeting: String): (String) -> String {
return { name -> "$greeting, $name!" }
}
fun main() {
val englishGreeter = createGreeter("Hello")
println(englishGreeter("Alice")) // 输出: Hello, Alice!
val spanishGreeter = createGreeter("Hola")
println(spanishGreeter("Bob")) // 输出: Hola, Bob!
}
可以省略返回类型声明,让编译器推断:
fun createMultiplier(factor: Int) = { number: Int -> number * factor }
fun main() {
val double = createMultiplier(2)
println(double(5)) // 输出: 10
val triple = createMultiplier(3)
println(triple(5)) // 输出: 15
}
fun createStringBuilderAction(): StringBuilder.() -> Unit {
return {
append("Hello, ")
append("World!")
}
}
fun main() {
val action = createStringBuilderAction()
val sb = StringBuilder()
sb.action()
println(sb.toString()) // 输出: Hello, World!
}
fun createOperation(operator: String): (Int, Int) -> Int {
return when (operator) {
"add" -> { a, b -> a + b }
"subtract" -> { a, b -> a - b }
"multiply" -> { a, b -> a * b }
else -> throw IllegalArgumentException("Unknown operator")
}
}
fun main() {
val add = createOperation("add")
println(add(5, 3)) // 输出: 8
val multiply = createOperation("multiply")
println(multiply(5, 3)) // 输出: 15
}
Iterable<T>.find(predicate: (T) -> Boolean): T?
Iterable<T>.firstOrNull(predicate: (T) -> Boolean): T?
val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8)
val firstEven = numbers.find { it % 2 == 0 } // 2
val firstOver10 = numbers.firstOrNull { it > 10 } // null
val firstOdd = numbers.first { it % 2 != 0 } // 1
// numbers.first { it > 10 } // 抛出 NoSuchElementException
val lastEven = numbers.last { it % 2 == 0 } // 8
val lastUnder5 = numbers.lastOrNull { it < 5 } // 4
val hasEven = numbers.any { it % 2 == 0 } // true
val hasNegative = numbers.any { it < 0 } // false
val noZeros = numbers.none { it == 0 } // true
val noEvens = numbers.none { it % 2 == 0 } // false
val allPositive = numbers.all { it > 0 } // true
val allEven = numbers.all { it % 2 == 0 } // false
val firstEvenIndex = numbers.indexOfFirst { it % 2 == 0 } // 1
val lastEvenIndex = numbers.indexOfLast { it % 2 == 0 } // 7
val singleDigit = listOf(1, 2, 3).single { it == 2 } // 2
// listOf(1, 2, 3).single { it > 1 } // 抛出 IllegalArgumentException
val unique = listOf(1, 2, 3).singleOrNull { it == 4 } // null
val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val result = numbers.takeWhile { it < 5 }
println(result) // 输出: [1, 2, 3, 4]
val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val evenNumbers = numbers.filter { it % 2 == 0 }
println(evenNumbers) // 输出: [2, 4, 6, 8, 10]
val mixedList = listOf(1, "two", 3, "four", 5.0)
val strings = mixedList.filterIsInstance<String>()
println(strings) // 输出: [two, four]
val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val evenCount = numbers.count { it % 2 == 0 }
println(evenCount) // 输出: 5
/*
* @param times 重复次数
*
*/
repeat(times: Int, action: (Int) -> Unit)
repeat(3) {
println("Hello") // 会打印3次"Hello"
}
repeat(3) { index ->
println("Iteration $index") // 打印 Iteration 0, Iteration 1, Iteration 2
}
T.run(block: T.() -> R): R
val result = "Hello".run {
println(this) // "Hello" (this指向接收者)
length // 返回值是Lambda的最后一行
}
println(result) // 5
run(block: () -> R): R
val result = run {
val x = 5
val y = 3
x + y // 返回值
}
println(result) // 8
val name: String? = "Kotlin"
name?.let {
println(it) // "Kotlin" (it指向接收者)
println(it.length) // 6
}
val person = Person().apply {
name = "Alice" // this.name = "Alice"
age = 25 // this.age = 25
}
val person = Person("Bob", 30)
val result = with(person) {
println(name) // 可以直接访问属性
println(age)
"Name: $name, Age: $age" // 返回值
}