Help us understand the problem. What is going on with this article?

Java開発者に送るKotlinこと始め

More than 1 year has passed since last update.

私が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...")
    }

ifwhentryが文じゃなくて式

ifwhentryは式なので結果を変数に代入したり、関数の戻り値として扱うことができます。

    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 {

}
yumemi
みんなが知ってるあのサービス、実はゆめみが作ってます。スマホアプリ/Webサービスの企画・UX/UI設計、開発運用。Swift, Kotlin, PHP, Vue.js, React.js, Node.js, AWS等エンジニア・クリエイターの会社です。Twitterで情報配信中https://twitter.com/yumemiinc
http://www.yumemi.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away