Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlin ことはじめ

Kotlin ことはじめ

Kotlin の紹介と Android 開発で Kotlin を使ってみた話

Kaido Iwamoto

March 26, 2016
Tweet

More Decks by Kaido Iwamoto

Other Decks in Programming

Transcript

  1. 自己紹介 • 岩本 海童 • 株式会社カラクル所属 • 半年ほど前から Android 開発を始めて、現在

    EC の アプリを開発中 • その前は Ruby, JavaScript で Web アプリの開発 • 2月終わりくらいから Kotlin を書き始めた • twitter: @odiak_
  2. Kotlin とは • JetBrains 社が開発している JVM 上で動く言語 • 2011年に公開され、今年の2月にv1.0がリリース •

    Java との互換性、コンパイルの速さが売り • Android Studio が Kotlin に対応しているので、 Android 開発でも少しづつ使われ始めている様子
  3. 型推論 文脈から型が推測できるときは型の記述を省略できる。 Java にもあるけど、 Kotlin よりも限定されている。 // Java double x

    = 1.23; int[] numbers = {1, 2, 4, 8}; ↓ // Kotlin var x = 1.23 val numbers = arrayOf(1, 2, 4, 8) var は再代入可 val は再代入不可 (Javaのfinalと同じ) 型を明示する場合は val y: Int = 12 のように書く
  4. null 安全 • いわゆる Optional 型というやつが言語レベルでサ ポートされている • 予期せぬ NPE

    を防ぐ。明示的に起こさなければ起 きない • String や Int に対して String? や Int? のよう な型があり、前者は null を許容しない、後者は null を許容する • T? な値に対して直接メソッドを呼ぶとコンパイル エラー
  5. null 安全 var a: String = "abc" var b: String?

    = "def" a = null // エラー b = null // OK b.length // エラー b?.length // OK : b が null の場合は式全体が null b!!.length // b が null の場合は NPE を起こす val s: String = b ?: "" // b が null の場合に "" b ?: return -1 // こうも書ける if (b != null) { println(b.length) // OK (smart cast)
  6. null 安全 // 補足 if (this.name != null) { this.name.length

    // エラー } 一度変数に入れるとか ?.let { … } とか
  7. ラムダとかリスト操作と か • 関数を値として扱うことができる • 引数は型推論の対象に • クロージャ • Collection

    や Array に map, filter, reduce な ど関数を受け取るメソッドがある
 → リスト操作が簡単に!
  8. ラムダ val array = arrayOf(1, 2, 3) array.map({ n: Int

    -> n * 2 }) // 戻り値はList<Int> array.map({ n -> n * 2 }) // 型は省略できる array.map({ it * 2 }) // 引数が1つなら array.map(){ … } // 最後のは外に出せる array.map { … } // 引数が関数のみの場合 array.map(Int::toString) // メソッド参照 var s = 0 array.forEach { s += it } // クロージャ
  9. ラムダ fun repeat(n: Int, f: (Int) -> Unit) { for

    (i in 0..(n - 1)) { f(i) } } repeat(4) { print(it) } // 0123 Kotlin では、トップ レベルに関数を定義 できる Unit は何も返さない ことを表す型 Java でいう Void ちなみに、repeatは組み込み関数です が、ここでは例として実装しています
  10. ゲッター・セッター • プロパティ: obj.prop みたいなやつ(Javaでいう フィールド) • アクセサは自動的に定義されるが、自分で書くこと もできる •

    値を保持するフィールドは backing field と呼ば れ、アクセサからしかアクセスできない
 (不要な場合は生成されない)
  11. ゲッター・セッター // アクセサを設定しない場合 class Person { var name = "さとし"

    var age = 20 fun toString() = "name: ${name}, age: ${age}" } val p = Person() p.age // = 20 p.name = "かいどう" println(p ) // name: かいどう, age: 20
  12. ゲッター・セッター // アクセサを設定する場合 class Person { var name: String =

    "さとし" get() = field + "さん" set(value) { field = if(value.isEmpty)"名無し" else value } … } val p = Person() p.name // "さとしさん" p.name = "たろう" println(p ) // name: たろうさん, age: 20 デフォルト実装またはfield を使う場合は初期値が必須。 初期値がない場合は型指定が 必須。
  13. 拡張関数・拡張プロパ ティ • 既存のクラスに、新しくメソッドやプロパティを追 加できる → XXXUtils 的なのが不要に! • 正確には、そのクラスのメソッドのように呼び出せ

    る関数で、静的に解決される
 (foo.bar(1, 2) が bar(foo, 1, 2) の構文糖衣的な) • クラスに同じ名前と引数のメソッドがあればそちら が優先される
  14. 拡張関数・拡張プロパ ティ fun <T> List<T>.join(delimiter: String): String { var str

    = "" var first = true for (e in this) { if (!first) str += delimiter else first = false str += e.toString() } return str } listOf(1, 2, 3).join("+") // "1+2+3"
  15. データクラス data class Person(val name: String, val age: Int) val

    man = Person("Tom", 23) println(man) // Person(name="Tom", age=23) val man2 = man.copy(name="Jack") println(man2) // Person(name="Jack", age=23) man == Person("Tom", 23) // true 続けてクラスの中身(メ ソッドとか)も書ける
  16. クラスの委譲 interface Base { fun say() } class BaseImpl(val msg:

    String) : Base { override fun say() { print(msg) } } class Derived(b: Base) : Base by b Derived(BaseImpl("hello")).say() // 出力: hello
  17. プロパティの委譲 class Delegate { operator fun getValue(thisRef: Any?, property: KProperty<*>):

    String { return "…" } operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) { // 何かする } } var s: String by Delegate() プロパティ s を参照したり s に 代入したりすると、 Delegate の メソッドが呼ばれる
  18. Kotlin の導入方法 (Android) 1. Android Studio に JetBrains 製の Kotlin

    プラ グインをインストールする 2. プロジェクトに Kotlin ファイル(.kt)を追加する
 (既存の Java ファイルを変換することもできる) 3. プロジェクトで Kotlin が未設定の場合は、 "Configure Kotlin" が表示されるのでクリックす ると build.gradle がいい感じになる
  19. よかった所 • Java で冗長だなと感じていたコードが比較的簡潔 に書けようになった(型推論とかラムダとか) • 読みやすくもなる • null 安全で安心。?.

    や ?: で null チェックが楽 になった
 (できるだけ T? より T 、 var より val を使いた くなる病気) • コンパイルが早い(体感)
  20. Java との相性 • Java と Kotlin でお互いのコードを使える • Java のゲッター・セッターは

    Kotlin のプロパ ティになる (getFoo/setFoo が foo になる感じで) • コンストラクタにデフォルト引数を使っても、 Java から呼ぶ時は引数を省略できない • Java から Kotlin に変換するツールもある
 (ほとんど使ったことはない) • まれにビルドが失敗する
  21. イディオムとか val button = Button(context).apply { background = someDrawable text

    = "TAP ME" } val name = fetchName() name?.let { println("name is ${it}") } val num = if (flag) 10 else 8 null でなければ関数が 呼ばれる オブジェクトの初期化 処理を書くときに使う if は式!
  22. イディオムとか val map = mapOf("a" to 3, "b" to 21,

    "c" to 1) map["b"] = 9 println(map["b"]) if (a == b) { … } // a?.equals(b) ?: b === null if (a === b) { … } // Java の == lateinit var textView: TextView みんな大好き Map 後から初期化できる変数 Activity で大活躍
  23. 自分の場合 • kotlinlang.org のリファレンスをひたすら読む
 (大体これですべて分かる) • try.kotlinlang.org で試す
 (書きながら試せるチュートリアルもあるよ) •

    それでも分からなければ Google
 (知らない組み込み関数があったりする) • あとはアプリのコードを書く
  24. まとめ • Kotlin で Android 開発が 今までより楽しくなった • Java を書いてる人みんな

    に Kotlin を試してほしい • Java に多少の不満を感じ てる人や、これから Android 開発を始めたい人 には特に使ってみてほしい Kotlin ͸͡ΊΑ͏ʂ
  25. _______ __ __ ______ _ __ __ __ _____ /__

    __/ / /_/ / / __ / / \/ / / /_/ / / __/ / / / __ / / __ / / / / __/ _\ \ /_/ /_/ /_/ /_/ /_/ /_/\_/ /_/\___\ /____/