【第4回】KotlinとJavaの「繰り返し文」の書き方を比較してみた
IT技術
【第4回】JavaからKotlinへ変えていくためのお勉強
(株)ライトコードの秋山(あきやま)です!
Androidアプリ開発していくにあたり「JavaからKotlinへ変えていくためのお勉強」という記事を連載をしています。
前回は、「Kotlinの条件分岐と範囲」を勉強してみました。
そして、今回は「Kotlinの繰り返し文」をJavaと比較しながら勉強していきたいと思います!
基礎的なことが続いて飽きてくる頃かとは思いますが、もう少しだけ基礎勉強の記事を書こうと思います!
Kotlinのfor文(範囲)
まずは、繰り返し文からいってみましょう!
Javaでは、繰り返し文として for文が用意されていましたよね。
Javaで書く場合
1//0〜4までの繰り返し
2for (int i = 0; i < 5; i++) {
3 System.out.println( i + "回目の表示です");
4}
[結果]
0回目の表示です
1回目の表示です
2回目の表示です
3回目の表示です
4回目の表示です
これを Kotlin で書くとこのようになります。
Kotlinで書くと
1for (i in 0..4) {
2 println("${i}回目の表示です")
3}
[結果]
0回目の表示です
1回目の表示です
2回目の表示です
3回目の表示です
4回目の表示です
Kotlin では「(変数名 in 範囲)」といった形で記述することが出来ます。
ここで気をつけておきたいのは、範囲の最後の数字も含まれるといったところです。
上記の場合は、「0..4」は「0<= i && i <=4」という意味となります。
Kotlinのfor文(指定した数だけ加算)
先ほどは1ずつ加算しましたが、1以外の数で加算する場合はどうでしょうか。
では、「3ずつ加算」した場合の例を見ていきたいと思います。
Javaで書く場合
1for (int i = 0; i < 10; i+=3) {
2 System.out.println( i + "回目の表示です");
3}
[結果]
0回目の表示です
3回目の表示です
6回目の表示です
9回目の表示です
と、このような感じになります。
Kotlinで書くと
1for (i in 0..9 step 3) {
2 println("${i}回目の表示です")
3}
[結果]
0回目の表示です
3回目の表示です
6回目の表示です
9回目の表示です
と、このように範囲の右横に「step 数値」と書くことができます。
Kotlinのfor文(指定した数だけ減算)
次に、減算の場合をご説明します。
以下のように、範囲の部分が「開始の数 downTo 終了の数」とすることで「1ずつ減算」します。
1for (i in 5 downTo 1) {
2 println(${i}回目の表示です")
3}
【結果】
5回目の表示です
4回目の表示です
3回目の表示です
2回目の表示です
1回目の表示です
指定した数だけ減算
1以外の減算をしたい場合は加算の時と同様に「終了の数」の右横に「step 減算したい数」と記述してください。
1for (i in 10 downTo 1 step 3) {
2 println("${i}回目の表示です")
3}
[結果]
10回目の表示です
7回目の表示です
4回目の表示です
1回目の表示です
Kotlinの配列
次に、配列について見ていきます。
まずは、Javaの「boolean型」「int型」「double型」「String型」の例から見ていきたいと思います!
Javaで書く場合
1//boolean型
2boolean bls[] = {true, false, false};
3
4//int型
5int nums[] = {1, 3, 5};
6
7//double型
8double dbls[] = {1.0, 4.2, 8.5, 10.6};
9
10//String型
11String[] strs = {"test1", "test2", "test3"};
他にもいろんな型がありますがひとまずはこんなところで。
これらを Kotlin で表すと以下のようになります。
Kotlinで書く場合
1//boolean型
2val bls = booleanArrayOf(true, false, false)
3
4//int型
5val nums = intArrayOf(1, 3, 5)
6
7//double型
8val dbls = doubleArrayOf(1.0, 4.2, 8.5, 10.6)
9
10//String型(「arrayOf」は数値以外で利用可能)
11val strs = arrayOf("test1", "test2", "test3")
基本的にboolean型や数値型に関しては「型名ArrayOf」の形式で書くことになります。
それ以外は「arrayOf」を使用する感じです。
また、以下のようにint型で枠の数だけ準備する場合は、このように書きます。
Javaで書いた場合
1int[] nums = new int[6]; // int型の初期値0が6つ
Kotlinで書く場合
1var nums = IntArray(6) // int型の初期値0が6つ
また、String型の場合は、以下のように「arrayOfNulls<型名>(数)」となります。
Javaで書いた場合
1String[] strs2 = new String[2]; // String型の初期値nullが2つ
Kotlinで書く場合
1var strs2 = arrayOfNulls<String>(2) // String型の初期値nullが2つ
null が初期値となりますので、そのあとの変数は null が許容できるようにしていきましょう。
KotlinのList
次に、List について解説していきます。
それでは、String型を格納していく List を見ていきます!
Javaで書く場合
1//宣言(ListにString型の値を3つ初期値として入れる)
2List<String> list = new ArrayList<>(Arrays.asList("test1", "test2", "test3"));
3
4//追加
5list.add("test4");
6
7//listの中身確認
8for(String s : list){
9 System.out.println(s);
10}
[結果]
test1
test2
test3
test4
これを Kotlin で表現すると以下のような形になります。
kotlin には、後から変更が出来ない「List」と、後から変更が出来る「MutableList」があります。
Kotlinで書いた場合
1//宣言(ListにString型の値を3つ初期値として入れる)
2var list = listOf("test1", "test2", "test3")
3
4// list.add("test4") // ←追加出来ない
5
6//listの中身確認
7for (s in list) {
8 println(s)
9}
[結果]
test1
test2
test3
Listの場合、後から値を追加したり変更することが出来ません。
MutableList
続いて、MutableList を見ていきます。
1//宣言(MutableListにString型の値を3つ初期値として入れる)
2var list = mutableListOf("test5", "test6", "test7")
3
4list.add("test8") // ←追加出来る
5
6//listの中身確認
7for (s in list) {
8 println(s)
9}
[結果]
test5
test6
test7
test8
MutableList では後から追加や変更が出来ます。
こちらのほうが Java の List の感覚に近いですね。
- 変更が無いデータは、List型を使う
- 変更があるデータは、MutableList型を使う
このように使い分けていきましょう。
KotlinのMap
続いて、「Map」について解説します!
まずは、JavaでのMapの使い方を見ていきたいと思います。
Javaで書く場合
1//宣言(key=String型、value=String型で初期値を3つ入れたもの)
2Map<String, String> map = new HashMap<String, String>() {
3 {
4 put("one", "1st");
5 put("two", "2nd");
6 put("three", "3rd");
7 }
8};
9
10//Mapにデータを追加
11map.put("four", "test4");
12
13//Mapの中身確認
14for (Map.Entry<String, String> m : map.entrySet()) {
15 System.out.println("key = " + m.getKey() + " : value = " + m.getValue());
16}
[結果]
key = four : value = test4
key = two : value = 2nd
key = one : value = 1st
key = three : value = 3rd
※取り出される順番は決まっていない
次に、同様の処理をKotlinで記述します。
Map型もList型と同様に後から変更が出来ない「Map」と、後から変更が出来る「MutableMap」があります。
また、Mapのデータを取得する例として、「for ((キーの変数名, 値の変数名) in map変数名)」の繰り返し文を利用してみたいと思います。
Kotlinで書いた場合
1//宣言(key=String型、value=String型で初期値を3つ入れたもの)
2var map = mapOf("one" to "1st", "two" to "2nd", "three" to "3rd")
3
4// map.put("four", "test4") // ←追加出来ない
5
6//mapの中身確認
7for ((key, value) in map) {
8 println("key = ${key} : value = ${value}")
9}
[結果]
key = one : value = 1st
key = two : value = 2nd
key = three : value = 3rd
※取り出される順番は決まっていない
初期値を入れる場合は「(キー1) to (値1), (キー2) to (値2), ...」といった形になります。
こちらも初期値として入れたデータ以降、変更は出来ないようになっています。
後から変更が出来る「MutableMap」
Map の中身を変更出来るようにしたい時は「MutableMap」を使用します。
1//宣言(key=String型、value=String型で初期値を3つ入れたもの)
2var map = mutableMapOf("one" to "1st", "two" to "2nd", "three" to "3rd")
3
4map.put("four", "test4") // ←追加出来る
5
6//mapの中身確認
7for ((key, value) in map) {
8 println("key = ${key} : value = ${value}")
9}
[結果]
key = one : value = 1st
key = two : value = 2nd
key = three : value = 3rd
key = four : value = test4
//※取り出される順番は決まっていない
Java を使ってた私としては、こっちのほうが自然で使いやすそうかなと感じました。
とはいえ、List と同様に必要に応じて使い分けていければベストですね!
第4回へつづく!
オススメ本
こちらの記事もオススメ!
2020.08.14スマホ技術 特集Android開発Android開発をJavaからKotlinへ変えていくためのお勉強DelegatedPropert...
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
第1回はこちら
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
元ファストフード店長代理のJava系ITエンジニア。 Webサイト系の開発や運用をいくらか経験し、 現在はAndroidアプリ開発を主に担当したり。 休みの日はゲームとか風景写真撮りに行ったりとかマラソンしたりとか。