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 ではコレクションに対して多くの操作を行う事が可能です。