KotlinDive

プログラミング言語 Kotlin についての入門ブログです。

コレクション

Kotlinのコレクション

Kotlinでは、他の多くの言語と違い、コレクションがミュータブル(可変)であるかイミュータブル(不変)であるかを厳密に区別します。 イミュータブルなコレクションでは、sizeやgetなどの読み取り操作は可能ですが、要素の書き換えなどはできません。
また、実体がミュータブルでも、一部の場所では読取り操作しかさせたくない場合などは、 イミュータブルな変数として渡すことで読取り操作しかできないようにすることもできます。
jkk コレクションにはList、Set、Mapがあり、それぞれにミュータブル版とイミュータブル版があります.

ミュータブル(型) イミュータブル(型) ミュータブル(生成) イミュータブル(生成)
List MutableList listOf() mutableListOf()
Set MutalbeList setOf() mutableSetOf()
Map<K, out V> MutalbeMap<K, out V> mapOf() mutableMapOf()

fun main(args: Array) {
    val fruits = mutableListOf("banana", "apple", "peach")
    val readOnlyViewOfFruits: List = fruits

    println(fruits)

    // fruitsはミュータブルなので要素の変更ができる
    fruits.add("melon")

    // Listは読取操作しかできないので、下記のコードはビルドエラーになる
    // readOnlyViewOfFruits.add("tomato")

    // readOnlyViewOfFruitsは読取り操作しかできないが、
    // 実体はfruitsなのでfruitsの変更が反映されている
    println(readOnlyViewOfFruits.size)

    val alphabets = setOf('a', 'b', 'c', 'd', 'c')
    println(alphabets.size)

    val productPrice = mapOf<String, Int>("Pen" to 200, "Note" to 300, "Coffee" to 100)
    println(productPrice["Coffee"])
}

[banana, apple, peach]
4
4
100

また、要素のクラスに継承関係があれば、次のような操作もできます。


import java.awt.Rectangle
import java.awt.Shape

fun main(args: Array) {
    val rects = listOf(Rectangle(1, 2, 3, 4), Rectangle(10, 20, 30, 40))
    val shapes: List = rects

    println(shapes)
}

[java.awt.Rectangle[x=1,y=2,width=3,height=4], java.awt.Rectangle[x=10,y=20,width=30,height=40]]

この例では、Shapeクラスを継承したRectangleクラスのListをShapeのクラスに代入しています。 代入した先のshapesの実体はrectsであるため、printlnするとrectangleの内容が出力されます。