読者です 読者をやめる 読者になる 読者になる

2016/12/12の30分 Kotlinメモ🍜

Kotlin

2016/12/12の30分 Kotlinメモ🍜

書いてるコードは雑にここにあります。

github.com

Calling Java code from Kotlin

kotlinlang.org

Getters and Setters

JavaのクラスのメソッドでsetXXXとgetXXXがあるやつは、Kotlin側でプロパティみたいに扱えるよ!って話かな??

例としか以下みたいなコードが書いてある。なるほど、便利。

setterとかgetterしかないものはダメっぽい。

import java.util.Calendar

fun calendarDemo() {
    val calendar = Calendar.getInstance()
    if (calendar.firstDayOfWeek == Calendar.SUNDAY) {  // call getFirstDayOfWeek()
        calendar.firstDayOfWeek = Calendar.MONDAY       // call setFirstDayOfWeek()
    }
}

Escaping for Java identifiers that are keywords in Kotlin

Kotlinの予約語とかをもしJavaのメソッドとかで使ってる場合、``で囲んでねって話。

public class JavaJava {

    public void is() {
        System.out.println(JavaJava.class.getName());
    }
}

JavaJava().`is`()

Null Safety

kotlinlang.org

みんな大好きnullの話。

これよくまとまってるので、ちゃんと読むと良さそう。

Nullable types and Non-Null Types

なるほど。

var hunhunhunhun: String = "abc"
hunhunhunhun = null // compilation error
println(hunhunhunhun.length)

var hunhunhunhun2: String? = "abc"
hunhunhunhun2 = null // OK
println(hunhunhunhun2.length) // compilation error

Safe Calls

?.ね。

続けても書ける。その場合、どこかでnullになればnullが返る。

var hunhunhunhun2: String? = "abc"
hunhunhunhun2 = null // OK
val len: Int? = hunhunhunhun2?.length
println(len)

val len2: Int? = hunhunhunhun2?.length?.toInt()
println(len2)

letと組み合わせて以下のようなこともできると。

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/let.html

val listWithNulls: List<String?> = listOf("A", null)
for (item in listWithNulls) {
    item?.let { println(it) } // prints A and ignores null
}

Elvis Operator

?:ね。三項演算子みたいだけど違うよ、全然違うよ。

var hunhunhunhun2: String? = "abc"
hunhunhunhun2 = null // OK

// こうも書けるけどー
println(if (hunhunhunhun2 != null) hunhunhunhun2.length else -1)

// Elvis Operator使ってこう書いた方がいい
println(hunhunhunhun2?.length ?: -1)

例外も投げられる。なので引数チェックとかに便利だよーって書いてあった気がする。

println(hunhunhunhun2?.length ?: throw Exception("hunhunhunhun2 is null."))

The !! Operator

!!で無視してアクセスできると。これはーまあ使わないかなーできるだけ。

var hunhunhunhun2: String? = "abc"
hunhunhunhun2 = null // OK
println(hunhunhunhun2!!.length)

Collections of Nullable Type

こんなのもあるよー的な。

val nullableList: List<Int?> = listOf(1, 2, null, 4)
val intList: List<Int> = nullableList.filterNotNull()
println(intList) // [1,2,4]

実装的には単純だよね。

/**
 * Appends all elements that are not `null` to the given [destination].
 */
public fun <C : MutableCollection<in T>, T : Any> Iterable<T?>.filterNotNullTo(destination: C): C {
    for (element in this) if (element != null) destination.add(element)
    return destination
}

まとめ

Null Safetyがよくまとまってて嬉しい😊