鼻偽のエルビス演算子(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: -1Elvis 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 - ディレクトリのすべてのファイルのリスト出力
- Kotlin - 2つのList一つの併合
- Kotlin - リストの並べ替え方法(sort、sortBy、sortWith)
- Kotlin - 乱数生成(Random、SecureRandom)
- Kotlin - StringをFloatに変換
- Kotlin - Destructuring Declaration
- Kotlin - objectとclassキーワードの違い
- Kotlin - 現在の日付と時刻を取得する方法