はじめに
普段 Swift で iOS アプリ開発をやっているのですが、たまに Kotlin で Android アプリ開発をやろうと思うとよく書き方忘れてるのでまとめておきます。(たまに Swift でいうこれみたいに書いてます)
長くなったので今回は変数についてのあれこれ
データ型
データ型は下記のようなものがあります。
型 | データ | リテラル例 |
---|---|---|
Byte | 8ビット整数 | 123 |
Short | 16ビット整数 | 123 |
Int | 32ビット整数 | 123 |
Long | 64ビット整数 | 12345L |
Float | 32ビット浮動小数点数 | 1234.56F |
Double | 64ビット浮動小数点数 | 1234.5678 |
Boolean | 真偽値 | true |
Char | 文字 | 'a' |
String | 文字列 | "文字列" |
Array | 配列 | なし arrayOfで初期化 |
List | リスト | なし listOfで初期化 |
MutableList | リスト | なし mutableListOfで初期化 |
Map | 連想配列 | なし mapOfで初期化 |
MutableMap | 連想配列 | なし mutableMapOfで初期化 |
Set | 集合 | なし setOfで初期化 |
MutableSet | 連想配列 | なし mutableSetOfで初期化 |
Any | 何でもいける | なし |
Unit | void | なし |
配列とリストの違いはあんまわかってないですが、基本的にリストを使えばいいと思います。
違いについてはこのアプリの「配列」と「リスト」をみるとわかりやすいかも?
変数宣言
変数宣言は val 変数名: 型
もしく var 変数名: 型
はのように行います。
1 2 3 4 5 |
val number: Int = 42 // swiftでいうlet var number: Int = 42 // swiftでいうvar // 型推論により型は省略可 val number = 42 |
型変換
数値 <-> 数値変換
数値から数値への変換には下記のように色々用意されている。
- toByte(): Byte
- toShort(): Short
- toInt(): Int
- toLong(): Long
- toFloat(): Float
- toDouble(): Double
文字列 <-> 数値変換
1 2 3 |
val str = "1" val num = str.toInt() // 文字列 -> 数値 val str2 = num.toString() // 数値 -> 文字列 |
定数
const
もあるみたいだが基本的に val
でいいと思う。
参考:kotlinで定数を定義する時【const】vs【val】
文字列操作
文字列操作色々
長さ
1 2 |
println("あいうえお".length) // 5 println("あいうえお".count()) // 5 |
抜き出し
1 2 3 4 |
val str = "あいうえお" println(str.substring(1..3)) // いうえ println(str.substring(1, 3)) // いう println(str[1]) // い |
結合
1 2 3 4 5 6 |
println("あいう" + "えお") // あいうえお println("あいう" .plus("えお")) // あいうえお val builder = StringBuilder() builder.append("あいう").append("えお") println("builder.toString()) // あいうえお |
大文字・小文字変換
1 2 3 4 5 6 |
println("abc".toUpperCase()) // ABC println("ABC".toLowerCase()) // abc // 先頭のみ println("abc".capitalize()) // Abc println("ABC".decapitalize()) // aBC |
置換
1 2 3 4 5 |
println("ababab".replace("a", "x")) // xbxbxb println("ababab".replaceBefore("b", "x")) // xbabab println("ababab".replaceAfter("b", "x")) // abx println("ababab".replaceAfterLast("a", "x")) // ababax println("ababab".replaceBeforeLast("a", "x")) // xab |
検索
1 2 3 4 5 |
println("abc".indexOf("b")) // 1 println("abc".contains("b")) // true println("abc".startsWith("a")) // true println("abc".endsWith("c")) // true |
分割
1 |
println("a,b,c".split(",")) // [a, b, c] |
テンプレート
1 2 |
val str = "abc" println("$str lenght is ${str.length}") // abc lenght is 3 |
空文字判定
isEmpty
系のメソッドはいっぱいあるみたい。。。
値 | isEmpty | isNotEmpty | isNullOrEmpty | isBlank | isNotBlank | isNullOrBlank | orEmpty |
---|---|---|---|---|---|---|---|
"" | true | false | true | true | false | true | 空文字列 |
" " | false | true | false | true | false | true | スペース |
null | Error | Error | true | Error | Error | true | 空文字列 |
"1" | false | true | false | false | true | false | 1 |
"0" | false | true | false | false | true | false | 0 |
参考:[Kotlin] isEmpty(), isBlank()などの違い早見表
リスト
リストには編集可能の MutableList
と編集不可の List
がある。List
には add
や remove
のメソッドがない。
初期化
リストの初期化は []
のようなリテラルはなく、下記のように初期化する。
1 2 3 4 |
val list1 = listOf(1, 2, 3) val list2 = listOfNotNull(null, 1, 2, 3, null) // [1, 2, 3] val list3 = mutableListOf(1, 2, 3) val list4 = mutableListOf<Int>() |
追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
val list1 = mutableListOf(1, 2, 3) list1.add(4) println(list1) // [1, 2, 3, 4] val list2 = mutableListOf(1, 2, 3) list2 += 4 println(list2) // [1, 2, 3, 4] val list3 = mutableListOf(1, 2, 3) list3.add(1, 0) println(list3) // [1, 0, 2, 3] val list4 = mutableListOf(1, 2, 3) list4.addAll(listOf(4, 5, 6)) println(list4) // [1, 2, 3, 4, 5, 6] val list5 = mutableListOf(1, 2, 3) list5 += listOf(4, 5, 6) println(list5) // [1, 2, 3, 4, 5, 6] |
削除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
val list1 = mutableListOf("1", "2", "3") list1.remove("3") println(list1) // [1, 2] val list2 = mutableListOf("1", "2", "3") list2 -= "3" println(list2) // [1, 2] val list3 = mutableListOf("1", "2", "3") list3.removeAt(2) println(list3) // [1, 2] val list4 = mutableListOf("1", "2", "3") list4.removeAll(listOf("2", "3")) println(list4) // [1] val list5 = mutableListOf("1", "2", "3") list5 -= listOf("2", "3") println(list5) // [1] val list6 = mutableListOf("1", "2", "3", "2") list6.removeIf { it == "2" } println(list6) // [1, 3] val list7 = mutableListOf("1", "2", "3") list7.clear() println(list7) // [] |
アクセス
なんかいっぱいある
1 2 3 4 5 6 7 8 9 10 11 12 13 |
val list = listOf("1", "2", "3") println(list[2]) // 3 範囲外はクラッシュ println(list.elementAt(2)) // 3 範囲外はクラッシュ println(list.elementAtOrElse(2) { 8 }) // 3 範囲外は8 println(list.elementAtOrNull(2)) // 3 範囲外はnull println(list.get(2)) // 3 範囲外はクラッシュ println(list.getOrElse(2) { 8 }) // 3 範囲外は8 println(list.getOrNull(2)) // 3 範囲外はnull println(list.component1) // 1 範囲外はnull println(list.component2) // 2 範囲外はnull |
その他便利メソッド・プロパティ
豊富にあるのでリストでなにかやりたかったら一度検索するといいかも。
参考:Kotlin の Collection まとめ ~List編~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
val list = listOf("1", "1", "2", "3") println(list.size) // 4 println(list.indices) // 0..3 println(list.lastIndex) // 3 println(list.contains("2")) // true println(list.containsAll(listOf("2", "3"))) // true println(list.indexOf("1")) // 0 println(list.lastIndexOf("1")) // 1 println(list.indexOfFirst { it == "1" }) // 0 println(list.indexOfLast { it == "1" }) // 1 println(list.isEmpty()) // false println(list.subList(2, 4)) // ["2", "3"] fromIndex < toIndexが取り出される println(list.asReversed()) // ["3", "2", "1", "1"] println(list.distinct()) // ["1", "2", "3"] 重複削除 println(list.sorted()) // ["1", "1", "2", "3"] println(list.all { it.length == 1 }) // true println(list.any { it.toInt() > 2 }) // true, いずれかの要素が満たす場合 println(list.count { it == "1"}) // 2 println(list.filter { it.toInt() > 1}) // ["2", "3"] println(list.map { it.toInt() }) // [1, 1, 2, 3] println(list.maxBy { it.toInt() }) // 3 println(list.minBy { it.toInt() }) // 1 // ループ処理 list.forEach { print(it) } // 1123 list.forEachIndexed { index, value -> print("[$index]=$value") } // [0]=1[1]=1[2]=2[3]=3 |
その他細かいのは下記参照
Map
あんまり使うかわからないのでざっくりメモ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
val map = mapOf("a" to "foo", "b" to "piyo") println(map["a"]) // foo val mutableMap = mutableMapOf("a" to "foo", "b" to "piyo") mutableMap.put("a", "hoge") mutableMap["c"] = "fuga" println(mutableMap) // {a=hoge, b=piyo, c=fuga} println(mutableMap.keys) // [a, b, c] println(mutableMap.values) // [hoge, piyo, fuga] mutableMap.remove("a") println(mutableMap) // {b=piyo, c=fuga} mutableMap.remove("b", "piyo") println(mutableMap) // {c=fuga} mutableMap.clear() println(mutableMap) // {} |
その他細かいのは下記参照
Null許容型
swift でいうオプショナル型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
var str: String? str = "A" println(str?.length) // Nullable println(str!!.length) // Non-Null(強制アンラップみたいなの) // エルビス演算子 val length = str?.length ?: 0 // swiftのこれ str?.count ?? 0 // スマートキャスト(varだと使えない) val valStr: String = "A" if (valStr != null) { println(valStr) // Non-Null } |
キャスト
1 2 3 4 5 6 |
fun hoge(text: CharSequence) { if (text is String) { val str = text as String // Non-Null } val str = text as? String // Nullable } |
let 関数とかもあるみたいだけどまたスコープ関数でまとめるときに書く予定。
さいごに
クラスとか関数についても書こうと思ったけど長くなったので分割します。
次書く予定。。。
参考
- Kotlinリファレンス
- Kotlinチートシート
- Kotlin - 文字列操作
- [Kotlin] isEmpty(), isBlank()などの違い早見表
- Kotlin の Collection まとめ ~List編~
コメント
[…] その1の続きです。条件式とスコープ関数について書きます。 […]
Testです。