Предположим, у меня есть список людей и хотел бы иметь Map<String, Person>
, где String - имя человека. Как мне это сделать в котлин?Java 8 stream.collect (Collectors.toMap()) analog in kotlin
ответ
Если предположить, что у вас есть
val list: List<Person> = listOf(Person("Ann", 19), Person("John", 23))
функция associateBy
, вероятно, удовлетворит:
val map = list.associateBy({ it.name }, { it.age })
/* Contains:
* "Ann" -> 19
* "John" -> 23
*/
Как сказано в KDoc, associateBy
:
Возвращает
Map
, содержащий значения, при условии, поvalueTransform
и с индексомkeySelector
функции, применяемые к элементам данного массива.Если у любого из двух элементов будет тот же ключ, который возвращается
keySelector
, последний добавляется на карту.Возвращенная карта сохраняет порядок итераций ввода исходного массива.
Он применим к любым Iterable
.
'toMap()' изменилось на 'toMapBy()' в текущем Kotlin, можете ли вы, пожалуйста, обновить ответ. –
Для других эквивалентов между «Stream.collect» и Kotlin см. Http://stackoverflow.com/questions/34642254/what-is-the-java-8-stream-collect-equivalent-in-kotlin –
@JaysonMinard, спасибо , обновил ответ, также использовал другую перегрузку 'toMapBy', которая ближе к' Collectors.toMap'. – hotkey
Связано с http://stackoverflow.com/q/34639208/97777 –
Связано с: http://stackoverflow.com/q/34642254 –