Lambda表达式的以下代码是如何执行的?
How does the following codes of Lambda Expression execute?
我创建了一个 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
}
你的 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, circle2, triangle1, triangle2, rectangle1, rectangle2).filter { shape ->
shape.area() > 20
}
}
我不确定你的 stringVar
是从哪里来的,所以我不确定除了打印它之外,你还希望在你的函数中发生什么。如果没有更多关于为什么在更新列表时需要字符串的上下文,这真的没有意义。
我创建了一个 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
}
你的 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, circle2, triangle1, triangle2, rectangle1, rectangle2).filter { shape ->
shape.area() > 20
}
}
我不确定你的 stringVar
是从哪里来的,所以我不确定除了打印它之外,你还希望在你的函数中发生什么。如果没有更多关于为什么在更新列表时需要字符串的上下文,这真的没有意义。