Skip to content

コレクションの構築

要素から構築する

コレクションを作成する最も一般的な方法は、標準ライブラリの関数であるlistOf<T>()setOf<T>()mutableListOf<T>()mutableSetOf<T>()を使用することです。 コレクションの要素をカンマ区切りのリストとして引数に指定すると、コンパイラが要素の型を自動的に検出します。空のコレクションを作成する場合は、型を明示的に指定します。

kotlin
val numbersSet = setOf("one", "two", "three", "four")
val emptySet = mutableSetOf<String>()

同様に、マップにはmapOf()mutableMapOf()関数が利用できます。マップのキーと値はPairオブジェクトとして渡されます(通常はto中置関数で作成されます)。

kotlin
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 1)

to表記は短命なPairオブジェクトを作成するため、パフォーマンスが重要でない場合にのみ使用することをお勧めします。過剰なメモリ使用を避けるには、別の方法を使用してください。たとえば、ミュータブルなマップを作成し、書き込み操作を使用して要素を追加できます。ここでapply()関数を使用すると、初期化処理を簡潔に保つのに役立ちます。

kotlin
val numbersMap = mutableMapOf<String, String>().apply { this["one"] = "1"; this["two"] = "2" }

コレクションビルダー関数で作成する

コレクションを作成するもう1つの方法は、ビルダー関数であるbuildList()buildSet()、またはbuildMap()を呼び出すことです。これらの関数は、対応する型の新しいミュータブルなコレクションを作成し、書き込み操作を使用して要素を追加し、同じ要素を持つ読み取り専用のコレクションを返します。

kotlin
val map = buildMap { // this is MutableMap<String, Int>, types of key and value are inferred from the `put()` calls below
    put("a", 1)
    put("b", 0)
    put("c", 4)
}

println(map) // {a=1, b=0, c=4}

空のコレクション

要素のないコレクションを作成するための関数もあります: emptyList()emptySet()、および emptyMap()。 空のコレクションを作成する際は、コレクションが保持する要素の型を指定する必要があります。

kotlin
val empty = emptyList<String>()

リストの初期化関数

リストには、リストのサイズと、そのインデックスに基づいて要素の値を定義する初期化関数を受け取る、コンストラクタのような関数があります。

kotlin
fun main() {
    val doubled = List(3, { it * 2 })  // or MutableList if you want to change its content later
    println(doubled)
}

具象型コンストラクタ

ArrayListLinkedListのような具象型のコレクションを作成するには、これらの型で利用できるコンストラクタを使用できます。同様のコンストラクタは、SetおよびMapの実装でも利用できます。

kotlin
val linkedList = LinkedList<String>(listOf("one", "two", "three"))
val presizedSet = HashSet<Int>(32)

コピー

既存のコレクションと同じ要素を持つコレクションを作成するには、コピー関数を使用できます。標準ライブラリのコレクションコピー関数は、同じ要素への参照を持つ_シャローコピー_コレクションを作成します。したがって、コレクションの要素に加えられた変更は、そのすべてのコピーに反映されます。

toList()toMutableList()toSet()などのコレクションコピー関数は、特定の時点でのコレクションのスナップショットを作成します。その結果は、同じ要素を持つ新しいコレクションです。元のコレクションに要素を追加または削除しても、コピーには影響しません。コピーもソースとは独立して変更できます。

kotlin
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")
}

これらの関数は、コレクションを他の型に変換するためにも使用できます。たとえば、リストからセットを作成したり、その逆も可能です。

kotlin
fun main() {
    val sourceList = mutableListOf(1, 2, 3)    
    val copySet = sourceList.toMutableSet()
    copySet.add(3)
    copySet.add(4)    
    println(copySet)
}

あるいは、同じコレクションインスタンスへの新しい参照を作成することもできます。新しい参照は、既存のコレクションでコレクション変数を初期化するときに作成されます。したがって、参照を介してコレクションインスタンスが変更されると、その変更はすべての参照に反映されます。

kotlin
fun main() {
    val sourceList = mutableListOf(1, 2, 3)
    val referenceList = sourceList
    referenceList.add(4)
    println("Source size: ${sourceList.size}")
}

コレクションの初期化は、ミュータビリティを制限するために使用できます。たとえば、MutableListへのList参照を作成した場合、この参照を介してコレクションを変更しようとすると、コンパイラはエラーを生成します。

kotlin
fun main() {
    val sourceList = mutableListOf(1, 2, 3)
    val referenceList: List<Int> = sourceList
    //referenceList.add(4)            //compilation error
    sourceList.add(4)
    println(referenceList) // shows the current state of sourceList
}

他のコレクションに対する関数の呼び出し

コレクションは、他のコレクションに対するさまざまな操作の結果として作成できます。たとえば、リストをフィルタリングすると、フィルターに一致する要素の新しいリストが作成されます。

kotlin
fun main() {
    val numbers = listOf("one", "two", "three", "four")  
    val longerThan3 = numbers.filter { it.length > 3 }
    println(longerThan3)
}

マッピングは、変換の結果からリストを生成します。

kotlin
fun main() {
    val numbers = setOf(1, 2, 3)
    println(numbers.map { it * 3 })
    println(numbers.mapIndexed { idx, value -> value * idx })
}

アソシエーションはマップを生成します。

kotlin
fun main() {
    val numbers = listOf("one", "two", "three", "four")
    println(numbers.associateWith { it.length })
}

Kotlinでのコレクションに対する操作の詳細については、コレクション操作の概要を参照してください。