Kotlin - エルビス演算子(Elvis Operation)

鼻偽のエルビス演算子(Elvis Operation)をご紹介します。

エルビス演算子は ?:で表現し、 ?:の左のオブジェクトがnon-nullの場合、そのオブジェクトの値が返され、nullであれば、 ?:の右側の値を返します。

三項演算子でどのようなオブジェクトをnull checkをして、例外処理することをパターン化したものと考えることができます。

まず、if-elseに実装したサンプルコードを見て、このコードをエルビス演算子を利用して再実装し、どのように動作することを確認します。

if-else

文字列の長さを求めるコードです。

Stringがnullの場合は-1をlenに割り当て、non-nullの場合、lengthをlenに割り当てるコードです。

fun main(args: Array<String>){

    val str: String? = "1234"
    val nullStr: String? = null

    var len: Int = if (str != null) str.length else -1
    println("str.length: $len")

    len = if (nullStr != null) nullStr.length else -1
    println("nullStr.length: $len")

}

Output:

str.length: 4
nullStr.length: -1

このコードをエルビス演算子を利用して再実装します。

Elvis Operation

str?.length ?: -1str?.lengthがnullでない場合、その値を返し、nullの場合は-1を返します。

?.はSafe callと呼ばれるもので、 str?.lengthコードはstrオブジェクトがnullのときにはnullを返し、nullでない場合は、str.lengthを返します。

fun main(args: Array<String>){

    val str: String? = "1234"
    val nullStr: String? = null

    var len: Int = str?.length ?: -1
    println("str.length: $len")

    len = nullStr?.length ?: -1
    println("nullStr.length: $len")

}

Output:

str.length: 4
nullStr.length: -1

Elvis Operation Example

メソッドでnullを返すように作成することもできます。

fun foo(node: Node): String? {
    val parent = node.getParent() ?: return null
}

または、Exceptionが発生するように実装することもできます。

fun foo(node: Node): String? {
    val name = node.getName() ?: throw IllegalArgumentException("name expected")
}

References

codechachaCopyright ©2019 codechacha