Kotlinプログラマのみなさんにはお馴染みだと思いますが、次のコードはコンパイルエラーになります。
val nullableArray: Array<Int>? = null
// 次のコードはコンパイルエラー
println("nullableArray.isEmpty() is ${nullableArray.isEmpty()}")
Arrayの拡張関数、isEmpty。
nullableArrayはArray<Int>?型ですから、.での関数呼び出しはできません。コンパイルエラーになります。?.を使う必要があります。
さて、Kotlin 1.3から加わったメソッドに、isNullOrEmptyというメソッドがあります。
fun <T> Array<*>?.isNullOrEmpty(): Booleanfun <T> Collection<T>?.isNullOrEmpty(): Booleanfun <K, V> Map<out K, V>?.isNullOrEmpty(): Boolean
これは、
Array<*>?Collection<T>?Map<out K, V>?
の拡張関数です。
Array<*>Collection<T>Map<out K, V>
の拡張関数ではありません。Nullable型の拡張関数です。
Nullable型なArray<*>?の拡張関数であるisNullOrEmptyはisEmptyとの大きな違いがあります。
次のように、.でも呼び出すことができます。?.でなくても呼び出すことが可能です。
val nullArray: Array<Any>? = null
// 次のコードはコンパイルエラーにならない
println("nullArray.isNullOrEmpty() is ${nullArray.isNullOrEmpty()}") // true
このような拡張関数は、Kotlin 1.3に追加されたものもありますが、もともとKotlin 1.0からあったものもあります。例えば次のようなものです。
- fun CharSequence?.isNullOrEmpty(): Boolean
- fun CharSequence?.isNullOrBlank(): Boolean
- fun String?.orEmpty(): String
- fun Array<*>?.isNullOrEmpty(): Boolean
- fun Collection?.isNullOrEmpty(): Boolean
- fun Map?.isNullOrEmpty(): Boolean
- fun Collection?.orEmpty(): Collection
- fun List?.orEmpty(): List
- fun Array?.orEmpty(): Array
- fun Map?.orEmpty(): Map
Nullable型でも、.で呼び出せる拡張関数がある。面白いですね。