返回

Kotlin 实战之 let、with、run、apply、also、takeIf、takeUnless、repeat 源码总结

Android

在 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 函数的作用是将一个对象作为参数,并检查该对象是否为非空。如果该对象为非空,则返回该对象;否则返回 nulltakeIf 函数非常适合在需要对一个对象进行操作之前先检查该对象是否为非空时使用。

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 中提供了丰富的内置高阶函数,可以帮助我们轻松地处理各种场景。这些高阶函数可以使我们的代码更加简洁、优雅和可读。

在实际开发中,我们可以根据需要灵活运用这些高阶函数,以提高代码的可读性、简洁性和可维护性。