覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Kotlin - コレクションの生成

Javaでのコレクションの初期化とKotlinの関数でのコレクションの初期化を比較してみます。
コレクションの内容と、実クラスを表示してみます。


Javaのコレクション

JavaにおけるList生成

List<Integer> list1 = Arrays.asList(1, 2, 3);
System.out.printf("Data -> %s, Class -> %s %n", list1, list1.getClass());

List<Integer> list2 = new ArrayList<>();
list2.add(1);
list2.add(2);
list2.add(3);

System.out.printf("Data -> %s, Class -> %s %n", list2, list2.getClass());

// Java 9 からこの書き方もできる
List<Integer> list3 = List.of(1, 2, 3);
System.out.printf("Data -> %s, Class -> %s %n", list3, list3.getClass());

◾️実行結果

Data -> [1, 2, 3], Class -> class java.util.Arrays$ArrayList 
Data -> [1, 2, 3], Class -> class java.util.ArrayList 
Data -> [1, 2, 3], Class -> class java.util.ImmutableCollections$ListN


JavaにおけるSet生成

Set<Integer> set1 = new HashSet<>();
set1.add(1);
set1.add(2);
set1.add(3);
System.out.printf("Data -> %s, Class -> %s %n", set1, set1.getClass());

// Java 9 からこの書き方もできる
Set<Integer> set2 = Set.of(1, 2, 3);
System.out.printf("Data -> %s, Class -> %s %n", set2, set2.getClass());

◾️実行結果

Data -> [1, 2, 3], Class -> class java.util.HashSet 
Data -> [1, 2, 3], Class -> class java.util.ImmutableCollections$SetN 


JavaにおけるMap生成

Map<String, Integer> map1 = new HashMap<>();
map1.put("key1", 1);
map1.put("key2", 2);
map1.put("key3", 3);
System.out.printf("Data -> %s, Class -> %s %n", map1, map1.getClass());

// Java 9 からこの書き方もできる
Map<String, Integer> map2 = Map.of("key1", 1, "key2", 2, "key3", 3);
System.out.printf("Data -> %s, Class -> %s %n", map2, map2.getClass());

◾️実行結果

Data -> {key1=1, key2=2, key3=3}, Class -> class java.util.HashMap 
Data -> {key1=1, key2=2, key3=3}, Class -> class java.util.ImmutableCollections$MapN 


Kotlinのコレクション

Kotlin ではコレクションを簡単に生成して初期化する関数がいくつも用意されています。

KotlinにおけるList生成

val list1 = listOf(1, 2, 3)
println("Data -> $list1, Class -> ${list1.javaClass}")

val list2 = arrayListOf(1, 2, 3)
println("Data -> $list2, Class -> ${list2.javaClass}")

◾️実行結果

Data -> [1, 2, 3], Class -> class java.util.Arrays$ArrayList
Data -> [1, 2, 3], Class -> class java.util.ArrayList


KotlinにおけるSet生成

val set1 = setOf(1, 2, 3)
println("Data -> $set1, Class -> ${set1.javaClass}")

val set2 = hashSetOf(1, 2, 3)
println("Data -> $set2, Class -> ${set2.javaClass}")

◾️実行結果

Data -> [1, 2, 3], Class -> class java.util.LinkedHashSet
Data -> [1, 2, 3], Class -> class java.util.HashSet


KotlinにおけるMap生成

val map1 = mapOf("key1" to 1, "key2" to 2, "key3" to 3)
println("Data -> $map1, Class -> ${map1.javaClass}")

val map2 = hashMapOf("key1" to 1, "key2" to 2, "key3" to 3)
println("Data -> $map2, Class -> ${map2.javaClass}")

◾️実行結果

Data -> {key1=1, key2=2, key3=3}, Class -> class java.util.LinkedHashMap
Data -> {key1=1, key2=2, key3=3}, Class -> class java.util.HashMap

Kotlin のコレクション生成関数によって作成されたインスタンスは、Java標準のコレクションが利用されている事がわかります。
これにより、Javaのコレクションに関する知識がそのまま流用できるということになります。

Kotlin の独自コレクションではなく Javaの標準コレクションを使用する事で、Javaコードとの相互運用が簡単になります。


拡張された操作が行える

Kotlin のコレクションは Java のコレクションと全く同じクラスであるにもかかわらず、Kotlin ではより多くの操作が可能です。

以下例では、Listの先頭要素を取得する first という関数と 最終要素を取得する last という関数を呼び出しています。
もちろん、この様な関数は Javaの標準コレクションには存在していません。

val list = listOf(1, 2, 3, 4, 5)
val firstElement = list.first()
val lastElement = list.last()
println("Data -> $list, 1st-element -> $firstElement, last-element -> $lastElement")

◾️実行結果

Data -> [1, 2, 3, 4, 5], 1st-element -> 1, last-element -> 5

List の先頭要素の値と、最終要素の値が取得できています。


これらにとどまらず、Kotlin ではコレクションに対して多くの操作を行う事が可能です。