微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

下面的 Lambda 表达式代码是如何执行的?

如何解决下面的 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 举报,一经查实,本站将立刻删除。