Kotlinの始め方 — 買い物リストでnull安全とデータクラスを試す
買い物データを、条件で選んで名前へ
- 買い物リストを実行し、条件を変えて比べる
- val・data class・filter/mapを理解する
- nullの場合の表示を決める
最初の目標:条件に合う商品と「ゲスト」を表示する
まずは公式Kotlin Playgroundを開き、JVMの実行対象で次のコードを試します。ブラウザだけで文法を体験でき、Androidアプリやデータベースを用意する必要はありません。
data class Item(
val name: String,
val price: Int
)
fun main() {
val items = listOf(
Item("りんご", 120),
Item("バナナ", 180),
Item("牛乳", 250)
)
val selected = items.filter {
it.price >= 180
}
println(
selected.map { it.name }
)
val nickname: String? = null
println(
nickname?.uppercase() ?: "ゲスト"
)
}
実行結果は次の2行です。
[バナナ, 牛乳]
ゲスト
最初の行は条件で選んだ商品名、2行目は名前が未登録だったときの表示です。it は、このfilterやmapで処理している1つの商品を表しています。
2か所だけ変えて、結果を予想する
価格条件を250以上にすると、商品名は [牛乳] になります。nicknameを「ひよこ」にすると、2行目は ひよこ になります。日本語のこの名前はuppercaseで見た目が変わりません。
String? はnullも持てる型、String は通常nullを持たせない型です。?. と ?: を使うと「値がなかったら何をするか」をコードへ書けます。!! はnullのとき例外になるので、確認を飛ばすために足さないようにします。
データクラスの自動生成では、主コンストラクターで宣言したプロパティが使われます。クラス本体に後から足したプロパティは同じ扱いではありません。copy() も浅いコピーなので、可変リストなどを持つ場合は参照先を共有することがあります。
val は再代入しないという約束です。val と書けばオブジェクト全体が不変になる、と覚えないようにしましょう。
手元のPCで動かしたくなったら
IntelliJ IDEAやAndroid Studioなど、公式にKotlinをサポートする開発環境を使えます。Kotlin/JVMではJDKも必要です。環境の導入手順は下の公式資料へ進みます。
コマンドライン版のコンパイラーとJDKを用意済みなら、上のコードを shopping.kt としてUTF-8で保存し、次でも実行できます。
kotlinc shopping.kt -include-runtime -d shopping.jar
java -jar shopping.jar
Playgroundで試すだけなら、このインストールは不要です。JVM向けのコードからJavaを利用するときも、Java側のnullやAPIの表現の違いを確認します。
つまずきやすい2つの思い込み
**「Sequenceへ変えれば必ず速い」**とは限りません。中間リストを減らせる一方、小さな処理では遅延処理の追加コストもあります。この3件の例では、まず読みやすいfilterとmapで結果を理解しましょう。
**「suspendと書けば自動で別スレッド」**でもありません。suspendは中断・再開できる関数の仕組みで、ブロックする処理の置き場所は別に考えます。launchやdelayなどを使う例では、通常kotlinx.coroutinesの依存設定も必要です。
Javaとの具体的な比較はJavaとKotlin、Android以外のアプリの選び方はFlutterとReact Nativeへ。まずは買い物リストの条件を変えて、自分で結果を説明できるところを目標にしましょう。
参考資料
- Kotlin — Get started — Playgroundと実行対象・導入の入口
- Kotlin — Basic syntax — main・val/var・filter/map
- Kotlin — Null safety — nullable・safe call・Elvis・例外
- Kotlin — Data classes — 自動生成対象と浅いコピー
- Kotlin — Command line — JVMコンパイルと実行
- Kotlin — Sequences — 遅延評価とオーバーヘッド
- Kotlin — Coroutines — 中断・スレッド・依存設定
- Android — Kotlin-first — Kotlin優先とJavaサポート