如何解决下面的 Lambda 表达式代码是如何执行的?
我创建了一个自定义过滤器来理解 Kotlin 中的 Lambda 表达式。代码如下;
我已经了解如何创建我们自己的自定义过滤器函数,如何在高阶函数中传递 lambda,但无法弄清楚这些行的执行顺序。
public interface Transformer<T extends Animal>
在下面的代码中,会根据哪个条件计算sum?
//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() }
}
解决方法
您的 lambda 被传递给您的 customFilter 函数,这就是它被执行的时间。
操作顺序,如果您要从图片中删除 lambda 传递,可能是这样的:
fun customFilteredList(shapes: List<Shape>): List<Shape> {
val resultList = mutableListOf<Shape>()
for (shape in shapes) {
if (shape.area() > 20) {
resultList.add(shape)
}
}
return resultList
}
fun main() {
// same instances from before
val shapesBefore = listOf(circle1,circle2,triangle1,triangle2,rectangle1,rectangle2)
val shapesAfter = customFilteredList(shapesBefore)
// do more stuff
}
我希望区别很明显。通过定义任何接受 lambda(不仅仅是过滤器)的函数,您将整个 lambda(本身就是一个范围)的引用传递给您的函数。届时,您的函数将在其自己的范围内执行 lambda。所有这些都在您的 main()
调用范围内执行。
顺便说一句,filter
是一个在 kotlin 标准库中实现的 lambda 接受函数,这也可能有帮助(对我有用)。
fun main() {
val shapes = listOf(circle1,rectangle2).filter { shape ->
shape.area() > 20
}
}
我不确定您的 stringVar
来自哪里,所以我不确定除了打印它之外您希望在您的函数中发生什么。如果没有更多上下文来说明更新列表时为什么需要该字符串,这真的没有意义。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。