Что такое эквивалент Kotlin для Java Stream.collect?

Если я хочу собрать коллекцию Kotlin во что-то, что не встроено в stdlib, как это сделать?

Ответ 1

Для сценариев, не охватываемых встроенными операциями toList() и т.д., вы можете использовать тот факт, что сбор - это просто сгиб. Таким образом,

val list: List<Pair<String, Int>> = listOf("Ann" to 19, "John" to  23)

вы можете собирать коллекцию по вашему выбору с помощью флага

val map: Map<String, Int> = list.fold(HashMap(), { accumulator, item ->
    accumulator.put(item.first, item.second); accumulator})

Если вы затем определите функцию расширения

fun <T, R> Iterable<T>.collectTo(accumulator: R, accumulation: (R, T) -> Unit) = 
    this.fold(accumulator, { accumulator, item -> accumulation(accumulator, item); accumulator } )

вы можете упростить

val map2: Map<String, Int> = list.collectTo(HashMap(), { accumulator, item -> 
    accumulator.put(item.first, item.second) })

Хотя в этом случае, конечно, вы могли бы просто использовать функцию расширения .toMap.

Ответ 2

ПРИМЕЧАНИЕ.. Для некоторых распространенных случаев, когда вы используете Stream.collect из Java 8, вы можете использовать уже существующие функции stdlib в Kotlin. Для тех, кого вы не можете найти в Котлине, вы можете исследовать создание пользовательских потоков, как описано в ответе @duncan. Этот ответ добавлен, чтобы помочь узнать, что способно в stdlib, поэтому вы можете решить, когда писать что-то обычай. Он отвечает на заголовок вопроса "Что такое эквивалент Kotlin для Java Stream.collect?"

В stdlib есть функции для усреднения, подсчета, различения, фильтрации, поиска, группировки, объединения, сопоставления, min, max, разбиения на разделы, нарезки, сортировки, суммирования, на/из массивов, в/из списков, из карт, объединения, сотерации, всех функциональных парадигм и т.д. Маленькие 1-лайнеры и не нужно использовать более сложный синтаксис Java 8. Я думаю, что единственное, чего не хватает в встроенном классе Java 8 Collectors, - это обобщение.

В другой SO Post подробно описываются эти эквивалентности: Какие эквиваленты Java 8 Stream.collect доступны в стандартной библиотеке Kotlin?