我有一个项目列表
val itemList = mutableListOf<Item>()
此列表由单独的代码填充,其大小为未知但不超过 5
我有5个不同的功能,它们将项目作为参数,并根据索引对项目执行操作
fun operation1(item:Item)
fun operation2(item:Item)
fun operation3(item:Item)
fun operation4(item:Item)
fun operation5(item:Item)
现在,我想迭代itemList并根据其索引对每个项执行不同的操作,以避免IndexOutOfBoundsException
我知道可以使用结合来完成,但我想知道是否可以在不使用 索引的情况下完成。 就像传递函数一样,varargs和代码会智能地对每个项目执行操作
或者通过使用任何kotlin权力,如扩展函数或lambda函数
答案 0 :(得分:2)
具有内置函数的解决方案:使用函数引用创建函数列表:
val operations = listOf(::operation1, ::operation2, ::operation3, ::operation4, ::operation5)
然后通过操作将每个项目与项目配对。 zip
方法的结果具有两个集合中较短的集合的长度,以防它们的大小不匹配。然后你只需重复这些操作,调用与每个项目配对的操作(使用forEach
函数的lambda参数的解构声明)。
itemList.zip(operations).forEach { (item, operation) ->
operation(item)
}
另一种具有您自己的扩展功能的解决方案:
fun <T> List<T>.performOperations(vararg operations: (T) -> Unit) {
this.forEachIndexed { index, item ->
operations[index](item)
}
}
用法:
itemList.performOperations(::operation1, ::operation2, ::operation3, ::operation4, ::operation5)
请注意,目前这不会优雅地处理大小不匹配,它需要每个项目的功能。您可以将其更改为此表单,以便它代替每个函数的项目:
fun <T> List<T>.performOperations(vararg operations: (T) -> Unit) {
operations.forEachIndexed { index, operation ->
operation(this.get(index))
}
}