Функция котлинской складчатости

Я пытаюсь преобразовать массив через fold в индексированную карту. Как-то IntelliJ отмечает, что когда я возвращаю аккумулятор, который он ожидает от Unit. Когда я удаляю возврат, он жалуется, что мне нужен тип данных, который я изначально хотел вернуть.

Код выглядит следующим образом (элемент – это только класс данных)

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

Его немного поздно, поэтому я, вероятно, пропущу что-то очень очевидное. Любая помощь будет очень оценена.

благодаря

Вместо return оператор return@fold . В Котлине return без квалификатора означает «возвращение от самого сокровенного fun (без учета лямбда)».

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

См. Что означает «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 }) 

В принципе, этот тип складки реализован в стандартной библиотеке: см. .groupBy { ... } .