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

Kotlin Lambda表达式的以下代码是如何执行的?,kotlin,lambda,functional-programming,anonymous-function,Kotlin,Lambda,Functional Programming,Anonymous Function,我创建了一个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 v

我创建了一个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() }
     
    }
//在名为customFilter的列表上创建一个类扩展函数,该函数将lambda函数作为参数
//并返回一个布尔值。类扩展函数返回一个列表
有趣的列表.customFilter(filterFunction:(形状,字符串)->(布尔值)):列表{
val resultList=mutableListOf()
用于(本图中的形状){
if(过滤器功能(形状)){
结果列表.添加(形状)
}
}
返回结果列表
}
主要内容(){
//假设已创建以下所有实例。
var shapes2=listOf(圆圈1、圆圈2、三角形1、三角形2、矩形1、矩形2)
shapes2=shapes2.customFilter{shape,stringVar->
println(stringVar)
形状.面积()>20
}.sortedBy{item->item.area()}
}
在以下代码中,将根据哪个条件计算总和

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

} 
fun main(){
val list=(1..5).toList()
val sum=list.customSum{item->item%2==0}
println(总和)
}
fun List.customSum(sumFunction:(Int)->Boolean):Int{
var总和=0
用于(本文件中的编号){
如果(编号%2==1)
总和+=数字
}
回报金额
} 

您的lambda将传递给customFilter函数,并在该函数执行时执行

    //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从照片中消失,可能是这样的:

fun customFilteredList(形状:列表):列表{
val resultList=mutableListOf()
用于(形状中的形状){
如果(shape.area()>20){
结果列表.添加(形状)
}
}
返回结果列表
}
主要内容(){
//和以前一样的例子
val shapesBefore=listOf(圆圈1、圆圈2、三角形1、三角形2、矩形1、矩形2)
val shapesAfter=customFilteredList(shapesBefore)
//多做事
}
我希望区别是明确的。通过定义任何接受lambda(而不仅仅是过滤器)的函数,可以将对整个lambda(其本身就是一个作用域)的引用传递给函数。此时,您的函数将在自己的范围内执行lambda。所有这些都是在
main()
调用的范围内执行的

另外一个可能也有帮助的地方是,
filter
是kotlin标准库中实现的lambda接受函数

fun main(){
val shapes=listOf(圆圈1、圆圈2、三角形1、三角形2、矩形1、矩形2)。过滤器{shape->
形状.面积()>20
}
}

我不确定您的
stringVar
来自何方,因此我不确定除了打印它之外,您希望在函数中使用它会发生什么。如果没有更多的上下文来解释为什么在更新列表时需要字符串,那就没有什么意义了。

为什么不添加打印语句/使用调试器自己查找呢?我已经添加了它,但在输出模式背后找不到任何概念。您更新的问题有一个问题-您从未实际执行lambda您正在传递到
customSum
。你应该做的是这样的:
for(这里的数字){if(someFunction(数字)){sum+=number}
然后返回sum。也许这样说会有帮助——函数是Kotlin中的一级原语。也就是说,它是一种东西,你可以传递,然后使用——即使你还不知道lambda的定义。关键是它们是基于签名(例如,
(Int)->Boolean
)键入的(就像在类型中一样),因此Kotlin可以在Java中生成适当的泛型/类。谢谢。这很有帮助。我添加了stringVar来添加一些print语句来理解语句执行的时间顺序。这个解释真的很酷,谢谢。嘿@tsalaroth,在下面的代码中,根据哪个条件求和来计算?我用以下代码编辑了主要问题。fun main(){val list=(1..5).toList()val sum=list.customSum{item->item%2==0}println(sum)}fun list.customSum(sumFunction:(Int)->Boolean):Int{var sum=0 for(此中的数字){if(数字%2==1)sum+=number}返回sum}