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

Kotlin ことはじめ

Kotlin ことはじめ

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

Avatar for Kaido Iwamoto

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. _______ __ __ ______ _ __ __ __ _____ /__

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