鼻偽のエルビス演算子(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 ?: -1
はstr?.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
Related Posts
- Kotlin - エルビス演算子(Elvis Operation)
- Kotlin - Timer、定期的に関数を実行する
- Kotlinで正規表現を使用する
- Kotlin - 文字列の比較方法(equals、==、compareTo)
- Kotlin - 2つのList一つの併合
- Kotlin - ディレクトリのすべてのファイルのリスト出力
- Kotlin - リストの並べ替え方法(sort、sortBy、sortWith)
- Kotlin - 乱数生成(Random、SecureRandom)
- Kotlin - StringをFloatに変換
- Kotlin - Destructuring Declaration
- Kotlin - objectとclassキーワードの違い
- Kotlin - 現在の日付と時刻を取得する方法