如何使用Kotlin折叠函数将数组转换为地图?

Oli*_*ver 3 kotlin

我试图通过折叠将数组转换为索引映射.不知怎的,IntelliJ标记当我返回它期望Unit的累加器时.当我删除返回它抱怨我需要我最初想要返回的数据类型.

代码如下(Item只是一个数据类)

    constructor(vararg items: Item){
    val itemMap = items.fold(mutableMapOf<Int, MutableList<Item>>(), { acc, item ->
        if (acc.containsKey(item.state)) {
            acc[item.state]?.add(item)
        } else {
            acc.put(item.state, mutableListOf(item))
        }
        return acc
    })

}
Run Code Online (Sandbox Code Playgroud)

它有点晚了所以我可能会错过一些非常明显的东西.任何帮助将非常感激.

谢谢

hot*_*key 13

使用合格的return@fold运算符代替return.在Kotlin中,return没有限定词意味着"从最里面回来fun(忽略lambdas)".

val itemMap = items.fold(mutableMapOf<Int, MutableList<Item>>(), { acc, item ->
    if (acc.containsKey(item.state)) {
        acc[item.state]?.add(item)
    } else {
        acc.put(item.state, mutableListOf(item))
    }
    return@fold acc
})
Run Code Online (Sandbox Code Playgroud)

看看Whats的"return @"是什么意思?,在语言参考中返回标签.

或者只使用结果表达式,省略return:

val itemMap = items.fold(mutableMapOf<Int, MutableList<Item>>(), { acc, item ->
    if (acc.containsKey(item.state)) {
        acc[item.state]?.add(item)
    } else {
        acc.put(item.state, mutableListOf(item))
    }
    acc
})
Run Code Online (Sandbox Code Playgroud)

基本上,这种折叠是在标准库中实现的:请参阅.groupBy { ... }.