Kotlinのコレクション
Kotlinでは、他の多くの言語と違い、コレクションがミュータブル(可変)であるかイミュータブル(不変)であるかを厳密に区別します。
イミュータブルなコレクションでは、sizeやgetなどの読み取り操作は可能ですが、要素の書き換えなどはできません。
また、実体がミュータブルでも、一部の場所では読取り操作しかさせたくない場合などは、
イミュータブルな変数として渡すことで読取り操作しかできないようにすることもできます。
jkk
コレクションにはList、Set、Mapがあり、それぞれにミュータブル版とイミュータブル版があります.
ミュータブル(型) | イミュータブル(型) | ミュータブル(生成) | イミュータブル(生成) |
---|---|---|---|
List |
MutableList |
listOf() | mutableListOf() |
Set |
MutalbeList |
setOf() | mutableSetOf() |
Map |
MutalbeMap |
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("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の内容が出力されます。