コレクションの作成
要素からの作成
コレクションを作成する最も一般的な方法は、標準ライブラリ関数の listOf<T>()、setOf<T>()、mutableListOf<T>()、mutableSetOf<T>() を使用することです。 カンマ区切りのコレクション要素を引数として渡すと、コンパイラは要素の型を自動的に推論します。空のコレクションを作成する場合は、型を明示的に指定してください。
val numbersSet = setOf("one", "two", "three", "four")
val emptySet = mutableSetOf<String>()Map についても、mapOf() および mutableMapOf() 関数を使用して同様のことが可能です。Map のキーと値は Pair オブジェクト(通常は中置関数 to を使用して作成されます)として渡されます。
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 1)to 記法は短命な Pair オブジェクトを作成するため、パフォーマンスが極めて重要でない場合にのみ使用することをお勧めします。過度なメモリ使用を避けるには、別の方法を使用してください。例えば、ミュータブルな Map を作成し、書き込み操作を使用して要素を追加できます。ここでは、apply() 関数を使用すると初期化を流れるように記述できます。
val numbersMap = mutableMapOf<String, String>().apply { this["one"] = "1"; this["two"] = "2" }コレクションビルダー関数による作成
コレクションを作成するもう一つの方法は、ビルダー関数(buildList()、buildSet()、または buildMap())を呼び出すことです。これらは、対応する型の新しいミュータブルなコレクションを作成し、書き込み操作を使用して要素を追加した後、同じ要素を持つ読み取り専用のコレクションを返します。
val map = buildMap { // これは MutableMap<String, Int> です。キーと値の型は、以下の put() 呼び出しから推論されます
put("a", 1)
put("b", 0)
put("c", 4)
}
println(map) // {a=1, b=0, c=4}空のコレクション
要素を持たないコレクションを作成するための関数、emptyList()、emptySet()、および emptyMap() も用意されています。 空のコレクションを作成する際は、そのコレクションが保持する要素の型を指定する必要があります。
val empty = emptyList<String>()List の初期化関数
List には、リストのサイズと、インデックスに基づいて要素の値を定義する初期化関数(イニシャライザ)を受け取る、コンストラクタのような関数があります。
fun main() {
val doubled = List(3, { it * 2 }) // 後で内容を変更したい場合は MutableList を使用します
println(doubled)
}具体的な型のコンストラクタ
ArrayList や LinkedList などの具体的な型のコレクションを作成するには、それらの型で利用可能なコンストラクタを使用できます。Set や Map の実装についても、同様のコンストラクタが利用可能です。
val linkedList = LinkedList<String>(listOf("one", "two", "three"))
val presizedSet = HashSet<Int>(32)コピー
既存のコレクションと同じ要素を持つコレクションを作成するには、コピー関数を使用できます。標準ライブラリのコレクションコピー関数は、同じ要素への参照を保持するシャローコピー(浅いコピー、shallow copy)を作成します。そのため、コレクションの要素に対して行われた変更は、そのすべてのコピーに反映されます。
toList()、toMutableList()、toSet() などのコレクションコピー関数は、特定の時点におけるコレクションのスナップショットを作成します。その結果、同じ要素を持つ新しいコレクションが作成されます。元のコレクションに要素を追加または削除しても、コピーには影響しません。また、コピーはソースとは独立して変更することも可能です。
class Person(var name: String)
fun main() {
val alice = Person("Alice")
val sourceList = mutableListOf(alice, Person("Bob"))
val copyList = sourceList.toList()
sourceList.add(Person("Charles"))
alice.name = "Alicia"
println("First item's name is: ${sourceList[0].name} in source and ${copyList[0].name} in copy")
println("List size is: ${sourceList.size} in source and ${copyList.size} in copy")
}これらの関数は、コレクションを他の型に変換するためにも使用できます。例えば、List から Set を作成したり、その逆を行ったりすることができます。
fun main() {
val sourceList = mutableListOf(1, 2, 3)
val copySet = sourceList.toMutableSet()
copySet.add(3)
copySet.add(4)
println(copySet)
}あるいは、同じコレクションインスタンスへの新しい参照を作成することもできます。既存のコレクション変数で新しいコレクション変数を初期化したときに、新しい参照が作成されます。そのため、参照を通じてコレクションインスタンスが変更されると、その変更はすべての参照に反映されます。
fun main() {
val sourceList = mutableListOf(1, 2, 3)
val referenceList = sourceList
referenceList.add(4)
println("Source size: ${sourceList.size}")
}コレクションの初期化は、可変性(mutability)を制限するために使用できます。たとえば、MutableList への List 参照を作成した場合、その参照を通じてコレクションを変更しようとすると、コンパイラはエラーを出力します。
fun main() {
val sourceList = mutableListOf(1, 2, 3)
val referenceList: List<Int> = sourceList
//referenceList.add(4) //コンパイルエラー
sourceList.add(4)
println(referenceList) // sourceList の現在の状態を表示します
}他のコレクションに対する関数の呼び出し
他のコレクションに対するさまざまな操作の結果として、新しいコレクションを作成することができます。例えば、リストを フィルタリング すると、フィルタに一致する要素の新しいリストが作成されます。
fun main() {
val numbers = listOf("one", "two", "three", "four")
val longerThan3 = numbers.filter { it.length > 3 }
println(longerThan3)
}マッピング は、変換の結果からリストを生成します。
fun main() {
val numbers = setOf(1, 2, 3)
println(numbers.map { it * 3 })
println(numbers.mapIndexed { idx, value -> value * idx })
}アソシエーション(関連付け) は、Map を生成します。
fun main() {
val numbers = listOf("one", "two", "three", "four")
println(numbers.associateWith { it.length })
}Kotlin でのコレクション操作に関する詳細は、コレクション操作の概要を参照してください。
