【发布时间】:2021-05-02 14:28:57
【问题描述】:
我创建了一个 customFilter 来理解 Kotlin 中的 Lambda 表达式。代码如下;
我已经了解我们如何创建自己的自定义过滤器函数,如何在高阶函数中传递 lambda,但无法弄清楚这些行的执行顺序。
//Create a class extension function on List<Shape> called customFilter which takes a lambda function as argument
//and returns a Boolean value. The class extension function returns a List
fun List<Shape>.customFilter(filterFunction: (Shape, String) -> (Boolean)): List<Shape> {
val resultList = mutableListOf<Shape>()
for (shape in this) {
if (filterFunction(shape)) {
resultList.add(shape)
}
}
return resultList
}
fun main(){
//assume all the following instances has been created.
var shapes2 = listOf(circle1, circle2, triangle1, triangle2, rectangle1, rectangle2)
shapes2 = shapes2.customFilter { shape, stringVar ->
println(stringVar)
shape.area() > 20
}.sortedBy { item -> item.area() }
}
下面的代码中会根据哪个条件计算sum?
fun main() {
val list = (1..5).toList()
val sum = list.customSum { item -> item % 2 == 0 }
println(sum)
}
fun List<Int>.customSum(sumFunction: (Int) -> Boolean): Int {
var sum = 0
for (number in this) {
if (number % 2 == 1)
sum += number
}
return sum
}
【问题讨论】:
-
为什么不添加打印语句/使用调试器自己找出来?
-
我已经添加了,找不到输出模式背后的任何概念。
-
您更新的问题有一个问题 - 您从未真正执行过您传递给
customSum的 lambda。你应该做的是:for (number in this) { if (someFunction(number)) { sum += number } }然后返回总和。 -
也许这样说会有所帮助 - 函数是 Kotlin 中的一流原语。意思是,它是一个东西,你可以传递,然后使用 - 即使你还不知道 lambda 的定义。关键是它们是基于签名(例如
(Int) -> Boolean)进行类型化的(如在类型中),因此 Kotlin 可以在 Java 中生成适当的泛型/类。
标签: kotlin lambda functional-programming anonymous-function