会社でKotlin勉強会(第20回)を開催した

今週は第20回を開催しました。

 

前回の様子はコチラ↓

kdnakt.hatenablog.com

 

 

[第20回の様子]

2020/07/01に第20回を開催した。

 

参加メンバーは自分を含めて3人。だんだん参加者が減っているような……悲しい。

 

勉強会本編の内容としては、Learn Kotlin by Exampleの第7章 DelegationのDelegated Propertiesを最後までやり、第8章 Productivity BoostersのNamed ArgumentsString Templatesの節まで進めた。

 

今回は、Learn Kotlin by ExampleのサイトのPlaygroundを利用してサンプルコードを実行したり、サンプルコードを変更して実験をしたりした。

play.kotlinlang.org

 

[学んだことや疑問点]

  • Delegated Properties: Standard Delegates
    • 先週でてきた「blockingLazy」はググっても出てこないので、やはり古い仕様だろうという結論に。
    • そもそもlazyがblockingっぽい。

dogwood008.github.io

  • Delegated Properties: Storing Properties in a Map
    • クラスのフィールドの値もMapなどに移譲できる
    • 渡されるMapにクラスで定義されたキーがない場合はjava.util.NoSuchElementExceptionの例外が発生した
    • 反対に、Mapにキーが多い場合は特に例外は発生しなかった
class User(val map: Map<String, Any?>) {
    val name: String by map
    val age: Int     by map
}

fun main() {
    val user = User(mapOf(
            "age"  to 25
    ))

    println("name = ${user.name}, age = ${user.age}")
    // Exception in thread "main" java.util.NoSuchElementException: Key age is missing in the map.
    // at kotlin.collections.MapsKt__MapWithDefaultKt.getOrImplicitDefaultNullable (MapWithDefault.kt:24) 
    // at User.getAge (File.kt:-1) 
    // at FileKt.main (File.kt:11) 
}
    • MapのバリューがAny?だったのでnullが入るが、UserクラスのフィールドはStringなどnullableでない型だったので試しにnamenullを入れたら動いてしまった。これはちょっと困るような......
    • ちなみにInt型のageに相当するmapの値がnullの場合はNullPointerExceptionが発生した
class User(val map: Map<String, Any?>) {
    val name: String by map
    val age: Int     by map
}

fun main() {
    val user = User(mapOf(
            "name" to null,
            "age"  to 25
    ))

    println("name = ${user.name}, age = ${user.age}, name is null: ${user.name == null}")
    // name = null, age = 25, name is null: true
}
  • Named Arguments
    • メソッドの呼び出し時に、順序を無視して名前付き引数が使えるよって話。Pythonとかに近いイメージ。
    • すでに勉強会の初回の内容から登場していたので、今更感が強い
  • String Templates
    • これも散々過去の勉強会で登場している内容。
    • println("$someVariable")のように$+変数名でその変数の値を参照して出力できる
    • println("${someVAriable == null}のように{}で囲んで式を書くこともできる

 

[まとめ]

今回は、前回実行できなかった「やったー!」を3回実行できた。やったー!

次回も引き続きProductivity Boostersを学んでいくぞ!