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

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

Для сценариев, не охватываемых встроенными операциями 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 расширения .toMap .

ПРИМЕЧАНИЕ. Для некоторых распространенных случаев, когда вы используете 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?