Kotlin 实战之 let、with、run、apply、also、takeIf、takeUnless、repeat 源码总结
2023-11-08 22:38:37
在 Java 语言中,我们经常会使用匿名内部类或者 lambda 表达式来处理一些临时对象或者局部变量。而在 Kotlin 中,我们可以使用更简洁优雅的方式来实现类似的功能,这就是高阶函数。
高阶函数 是指可以接受函数作为参数或返回函数的函数。Kotlin 中提供了丰富的内置高阶函数,可以帮助我们轻松地处理各种场景。
let
let
函数的作用是将一个非空对象作为参数,并返回一个该对象的 lambda 表达式的结果。let
函数非常适合在需要对一个对象进行一系列操作时使用,可以使代码更加简洁和可读。
val list = listOf(1, 2, 3, 4, 5)
val result = list.filter { it % 2 == 0 }.map { it * 2 }.sum()
println(result) // 输出:20
上面的代码中,我们使用 filter
函数过滤出偶数,然后使用 map
函数将偶数乘以 2,最后使用 sum
函数计算出偶数的和。
我们也可以使用 let
函数来重写这段代码:
val list = listOf(1, 2, 3, 4, 5)
val result = list.filter { it % 2 == 0 }.let {
it.map { it * 2 }.sum()
}
println(result) // 输出:20
这样写的好处是,我们可以将一系列操作封装在 let
函数的 lambda 表达式中,使代码更加简洁和可读。
with
with
函数的作用是将一个对象作为参数,并在该对象的扩展函数作用域内执行一系列操作。with
函数非常适合在需要对一个对象进行一系列操作时使用,可以使代码更加简洁和可读。
val person = Person("Alice", 25)
with(person) {
println("Name: $name")
println("Age: $age")
}
上面的代码中,我们使用 with
函数来访问 Person
对象的属性。这样写的好处是,我们可以避免在每次访问属性时都需要写上对象名称,使代码更加简洁和可读。
run
run
函数的作用是将一个对象作为参数,并在该对象的扩展函数作用域内执行一系列操作。run
函数与 with
函数非常相似,但 run
函数返回的是 lambda 表达式的结果,而 with
函数返回的是 Unit
。
val person = Person("Alice", 25)
val result = person.run {
"$name is $age years old."
}
println(result) // 输出:Alice is 25 years old.
上面的代码中,我们使用 run
函数来生成一个字符串。这样写的好处是,我们可以避免在每次访问属性时都需要写上对象名称,使代码更加简洁和可读。
apply
apply
函数的作用是将一个对象作为参数,并在该对象的扩展函数作用域内执行一系列操作。apply
函数与 run
函数非常相似,但 apply
函数返回的是该对象本身,而 run
函数返回的是 lambda 表达式的结果。
val person = Person("Alice", 25)
person.apply {
name = "Bob"
age = 30
}
println(person) // 输出:Person(name=Bob, age=30)
上面的代码中,我们使用 apply
函数来修改 Person
对象的属性。这样写的好处是,我们可以避免在每次访问属性时都需要写上对象名称,使代码更加简洁和可读。
also
also
函数的作用是将一个对象作为参数,并在该对象的扩展函数作用域内执行一系列操作。also
函数与 apply
函数非常相似,但 also
函数返回的是该对象本身,而 apply
函数返回的是 Unit
。
val person = Person("Alice", 25)
val result = person.also {
it.name = "Bob"
it.age = 30
}
println(result) // 输出:Person(name=Bob, age=30)
上面的代码中,我们使用 also
函数来修改 Person
对象的属性。这样写的好处是,我们可以避免在每次访问属性时都需要写上对象名称,使代码更加简洁和可读。
takeIf
takeIf
函数的作用是将一个对象作为参数,并检查该对象是否为非空。如果该对象为非空,则返回该对象;否则返回 null
。takeIf
函数非常适合在需要对一个对象进行操作之前先检查该对象是否为非空时使用。
val person = Person("Alice", 25)
val result = person.takeIf { it.age > 18 }
println(result) // 输出:Person(name=Alice, age=25)
上面的代码中,我们使用 takeIf
函数来检查 Person
对象的年龄是否大于 18 岁。这样写的好处是,我们可以避免在对 Person
对象进行操作之前先检查该对象是否为非空,使代码更加简洁和可读。
takeUnless
takeUnless
函数的作用是将一个对象作为参数,并检查该对象是否为非空。如果该对象为非空,则返回 null
;否则返回该对象。takeUnless
函数与 takeIf
函数相反,非常适合在需要对一个对象进行操作之前先检查该对象是否为非空时使用。
val person = Person("Alice", 25)
val result = person.takeUnless { it.age > 18 }
println(result) // 输出:null
上面的代码中,我们使用 takeUnless
函数来检查 Person
对象的年龄是否大于 18 岁。这样写的好处是,我们可以避免在对 Person
对象进行操作之前先检查该对象是否为非空,使代码更加简洁和可读。
repeat
repeat
函数的作用是重复执行一个操作指定次数。repeat
函数非常适合在需要重复执行一个操作时使用,可以使代码更加简洁和可读。
val result = repeat(5) {
println("Hello, world!")
}
上面的代码中,我们使用 repeat
函数重复执行 println("Hello, world!")
操作 5 次。这样写的好处是,我们可以避免在每次执行操作时都需要写上重复次数,使代码更加简洁和可读。
总结
Kotlin 中提供了丰富的内置高阶函数,可以帮助我们轻松地处理各种场景。这些高阶函数可以使我们的代码更加简洁、优雅和可读。
在实际开发中,我们可以根据需要灵活运用这些高阶函数,以提高代码的可读性、简洁性和可维护性。