2015-07-12 3 views
4

Предположим, у меня есть список людей и хотел бы иметь Map<String, Person>, где String - имя человека. Как мне это сделать в котлин?Java 8 stream.collect (Collectors.toMap()) analog in kotlin

+0

Связано с http://stackoverflow.com/q/34639208/97777 –

+0

Связано с: http://stackoverflow.com/q/34642254 –

ответ

9

Если предположить, что у вас есть

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.

+0

'toMap()' изменилось на 'toMapBy()' в текущем Kotlin, можете ли вы, пожалуйста, обновить ответ. –

+0

Для других эквивалентов между «Stream.collect» и Kotlin см. Http://stackoverflow.com/questions/34642254/what-is-the-java-8-stream-collect-equivalent-in-kotlin –

+0

@JaysonMinard, спасибо , обновил ответ, также использовал другую перегрузку 'toMapBy', которая ближе к' Collectors.toMap'. – hotkey