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(): Boolean
fun <T> Collection<T>?.isNullOrEmpty(): Boolean
fun <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型
でも、.
で呼び出せる拡張関数がある。面白いですね。