基于索引的列表项不同的函数调用,不用时

时间:2018-04-12 10:46:21

标签: collections kotlin

我有一个项目列表

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函数

1 个答案:

答案 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))
    }
}