たとえば、次のような文字列のリストがあります。
val list = listOf("a", "b", "c", "d")
そして、文字列がキーとなるマップに変換したいと思います。
.toMap()
関数を使用する必要があることは知っていますが、方法はわかりません。また、その例も見ていません。
次の2つの選択肢があります。
最初で最もパフォーマンスが高いのは、キーと値の生成に2つのラムダを使用し、マップの作成をインライン化するassociateBy
関数を使用することです。
val map = friends.associateBy({it.facebookId}, {it.points})
2番目のパフォーマンスの低い方法は、標準のmap
関数を使用してPair
のリストを作成し、toMap
が最終マップを生成するために使用できるようにすることです。
val map = friends.map { it.facebookId to it.points }.toMap()
List
関数を使用したMap
からassociate
へKotlin 1.3では、List
に associate
という関数があります。 associate
には次の宣言があります。
fun <T, K, V> Iterable<T>.associate(transform: (T) -> Pair<K, V>): Map<K, V>
指定されたコレクションの要素に適用される
Map
関数によって提供されるキーと値のペアを含むtransform
を返します。
使用法:
class Person(val name: String, val id: Int)
fun main() {
val friends = listOf(Person("Sue Helen", 1), Person("JR", 2), Person("Pamela", 3))
val map = friends.associate({ Pair(it.id, it.name) })
//val map = friends.associate({ it.id to it.name }) // also works
println(map) // prints: {1=Sue Helen, 2=JR, 3=Pamela}
}
List
関数を使用したMap
からassociateBy
へKotlinでは、List
に associateBy
という関数があります。 associateBy
には次の宣言があります。
fun <T, K, V> Iterable<T>.associateBy(keySelector: (T) -> K, valueTransform: (T) -> V): Map<K, V>
Map
によって提供され、指定されたコレクションの要素に適用されるvalueTransform
関数によってインデックス付けされた値を含むkeySelector
を返します。
使用法:
class Person(val name: String, val id: Int)
fun main() {
val friends = listOf(Person("Sue Helen", 1), Person("JR", 2), Person("Pamela", 3))
val map = friends.associateBy(keySelector = { person -> person.id }, valueTransform = { person -> person.name })
//val map = friends.associateBy({ it.id }, { it.name }) // also works
println(map) // prints: {1=Sue Helen, 2=JR, 3=Pamela}
}
このタスクには associate
を使用できます。
val list = listOf("a", "b", "c", "d")
val m: Map<String, Int> = list.associate { it to it.length }
この例では、list
の文字列がキーになり、対応する長さ(例として)がマップ内の値になります。
1-アソシエイト(ケイズとバリューを設定可能):キーとバリューの要素を設定できるマップを作成します:
IteratableSequenceEements.associate { newKey to newValue } => Map {newKey :
newValue ,...}
2 -associateBy(計算によってキーを設定するだけ):新しいキーを設定できるマップを作成します。類似した要素が値に設定されます
IteratableSequenceEements.associateBy { newKey } => Map {newKey : 'Values will
be set from IteratableSequenceEements' ,...}
3- AssociatedWith(計算により値を設定するだけ):新しい値を設定できるマップを作成します。類似した要素がキーに設定されます
IteratableSequenceEements.associateWith { newValue } => Map { 'Keys will be set
from IteratableSequenceEements' : newValue , ...}
RCバージョンでは変更されています。
val map = list.groupByTo(destinationMap, {it.facebookId}, { it -> it.point })
を使用しています