私がKotlinでの開発を始めた頃、戸惑ったポイントを書きます。
この記事を読んだJava開発者の方が、Kotlin開発のいいスタートが切れますように...
変数宣言
Javaで変数を宣言してみます。
int i = 0;
これをKotlinで書くと
var i: Int = 0
こうなります。
- セミコロン不要 (あっても良いです)
- 型を記述する位置が違う→
変数名:型
では、varは?
varとval
var (variable)
Javaのfinalじゃない変数と同じです。初期化後に再代入できます。
val (value)
Javaのfinal付き変数と同じです。初期化後に再代入できません。
val i: Int = 0
i = 1 // コンパイルエラー
var i: Int = 0
i = 1 // OK
変数はなるべく、再代入NGのvalで宣言しましょう。
varは必要な時だけにしましょう。
ちなみにvalの場合でも、宣言箇所で初期化しなくても良いです。
val i: Int
if (flag) {
i = 1
}
else {
i = 4
}
型推論
Kotlinには型推論があります。
推論を使わずに変数を宣言すると、↓ですが
val i: Int = 0
推論を使うと型を省略できます↓
val i = 0
リテラルから型を推論してみます。
val i = 0 // Int
val l = 0L // Long
val f = 0F // Float
val d = 0.0 // Double
val c = 'c' // Char
val str = "str" // String
関数の戻り値を推論してみます。
fun getString(): String {
return "kotlin"
}
val str = getString()
// val str: String と書かなくても良い
switchがない
Kotlinにswitchがありません。代わりにwhenがあります。
曜日を表すenumを扱ってみます。
enum class DayOfWeek {
SUN, MON, TUE, WED, THU, FRI, SAT
}
val dayOfWeek: DayOfWeek = DayOfWeek.MON
// 土日は良いです それ以外は悪いです
when (dayOfWeek) {
DayOfWeek.SUN -> println("Good!")
DayOfWeek.SAT -> println("Good!")
else -> println("Bad...")
}
式が2つ以上の場合は->に続けて{ } で囲う事もできます。
when {
`条件` -> { `式` }
}
whenでbreak句は使えません。デフォルトでbreakします。
複数条件を一括で扱いたい場合は、カンマで区切ります。
when (dayOfWeek) {
DayOfWeek.SUN, DayOfWeek.SAT -> println("Good!")
else -> println("Bad...")
}
ifやwhenやtryが文じゃなくて式
if、when、tryは式なので結果を変数に代入したり、関数の戻り値として扱うことができます。
val v = if (flag) {
"I like Kotlin!"
} else {
"(T_T)"
}
最後に評価された式が、ifの結果となります。
flagがtrueだった場合、"I like Kotlin!"がif式の結果となり、
変数vに代入されます。
上の例は、ちょうどJavaの三項演算子と同じ用法です。
kotlinに三項演算子はありません。
// Java
String v = flag ? "I like Kotlin!" : "(T_T)";
voidがない
Kotlinにvoidはありません。
戻り値のない関数を表す場合はUnitという型を使います。
fun doSomething(): Unit {
// doSomething
}
コレクション
ListやArrayのインスタンスを生成する便利な関数があります。
val list = listOf(0, 1, 2)
val empty = emptyList<Int>()
val arr = arrayOf('a', 'b', 'c')
val empty = emptyArray<Char>()
XXXof()は可変長引数の関数で、コレクションの要素を記述できます。
空のコレクションを生成する場合はemptyXXX()関数が便利です。
| 型 | 生成 | 空生成 |
|---|---|---|
| Array | arrayOf() | emptyArray() |
| List | listOf() | emptyList() |
| Set | setOf() | emptySet() |
| Map | mapOf() | emptyMap() |
要素の方が推論できない場合は、型パラメータを指定する必要があります。
val numList = listOf<Number>(0.0F, 100, 1_000_000_000_000L)
Mutableなコレクション
Kotlinのコレクションは大きく分けて2種類あります。
変更可能なコレクション(Mutable)と、変更不可なコレクション(Immutable)です。
要素を追加するadd()関数や、削除するremove()関数はMutableなコレクションにしか存在しません。
| Immutable | Mutable |
|---|---|
| List | MutalbeList |
| Set | MutableSet |
| Map | MutableMap |
Mutableなコレクションを生成するにはmutableXXXof()関数が便利です。
val list = mutableListOf(0, 1, 2)
list.add(3)
関数と変数はクラスに属さなくても良い
Javaと違い、Kotlinの関数と変数はクラスに属さなくてもOKです。
import com.package
// クラスに属さない関数
fun topLevelFunction() {
// do something
}
// クラスに属さない変数
var topLevelVariable = 0
class Hoge {
}