?:
たとえばこの場合はどうなるのかわかりません
val list = mutableList ?: mutableListOf()
なぜこれに変更できるのですか
val list = if (mutableList != null) mutableList else mutableListOf()
回答:
TL; DR:結果のオブジェクト参照[第1オペランド]がでないnull
場合は、返されます。それ以外の場合は、第2オペランドの値(可能性がありますnull
)が返されます
エルビス演算子は、多くのプログラミング言語、例えばKotlinだけでなく、Groovyのか、C#の一部です。ウィキペディアの定義はかなり正確だと思います。
特定のコンピュータ・プログラミング言語では、エルビス演算子は
?:
あるバイナリ演算子そのオペランドである場合、その最初のオペランドを返しtrue
、そうでなければ、その第二オペランドを評価し、返します。これは、これらの言語(および他の多くの言語)で見られる三項条件演算子の変形です? :
。エルビス演算子は、第2オペランドが省略された三項演算子です。
Kotlinには、特に次のことが当てはまります。
一部のコンピュータープログラミング言語では、この演算子のセマンティクスが異なります。最初のオペランドがブール値になる代わりに、オブジェクト参照になる必要があります。結果のオブジェクト参照がでない
null
場合は、返されます。それ以外の場合は、第2オペランドの値(可能性がありますnull
)が返されます。
例:
x ?: y // yields `x` if `x` is not null, `y` otherwise.
elvis operator
以上他の何かに還元できるとは思っていませんでした。いいね!そしていい説明、ありがとう!
エルビス演算子は、コロン疑問符で表されます。?:
そしてそれは、この構文で使用することができます。
first operand ?: second operand
それはあなたが簡潔なコードを書くことを可能にし、そのように機能します:
first operand
nullでない場合は、が返されます。nullの場合、second operand
が返されます。これは、指定された値がnullの場合にnull不可能な値を指定するため、式がnull値を返さないことを保証するために使用できます。
例(Kotlin):
fun retrieveString(): String { //Notice that this type isn't nullable
val nullableVariable: String? = getPotentialNull() //This variable may be null
return nullableVariable ?: "Secondary Not-Null String"
}
この場合、の計算値がgetPotentialNull
nullでない場合は、retrieveString
;によって返されます。nullの場合、"Secondary Not-Null String"
代わりに2番目の式が返されます。
また、右側の式は、左側がnullの場合にのみ評価されることに注意してください。
Kotlinではsecond operand
、throw Exception
式など、任意の式を使用できます。
return nullVariable ?: throw IllegalResponseException("My inner function returned null! Oh no!")
エルビス演算子という名前は、有名なアメリカの歌手エルビスプレスリーに由来しています。彼の髪型は疑問符に似ています
出典:Wojda、I。Moskala、M。KotlinによるAndroid開発。2017. Packt Publishing
これはエルビス演算子と呼ばれ、実行されます...質問で説明したとおりです。左側がnull
値の場合、代わりに右側を返します。これは一種のフォールバックです。それ以外の場合は、左側の値を返すだけです。
a ?: b
の省略形ですif (a != null) a else b
。
タイプを使用したその他の例:
val x: String? = "foo"
val y: String = x ?: "bar" // "foo", because x was non-null
val a: String? = null
val b: String = a ?: "bar" // "bar", because a was null
a != null ? a : b
定義を見てみましょう:
null可能な参照rがある場合、「rがnullでない場合はそれを使用し、そうでない場合はnull以外の値xを使用する」と言うことができます。
?:
(エルビス)演算子は、冗長性を回避し、あなたのコードは本当に簡潔になります。
たとえば、多くのコレクション拡張関数null
はフォールバックとして返されます。
listOf(1, 2, 3).firstOrNull { it == 4 } ?: throw IllegalStateException("Ups")
?:
複数のフォールバックレイヤーがある場合でも、フォールバックケースを慎重に処理する方法を提供します。もしそうなら、あなたはここのように単純に乗算エルビス演算子を連鎖させることができます:
val l = listOf(1, 2, 3)
val x = l.firstOrNull { it == 4 } ?: l.firstOrNull { it == 5 } ?: throw IllegalStateException("Ups")
もしあなたが他の場合と同じことを表現するなら、それは読みにくいもっとたくさんのコードになるでしょう。
簡単に言えば、あなたには両手があります。あなたは知りたいです、あなたの左手は今働いていますか?左手が機能しない場合、return
empty
それ以外の場合busy
Javaの例:
private int a;
if(a != null){
println("a is not null, Value is: "+a)
}
else{
println("a is null")
}
Kotlinの例:
val a : Int = 5
val l : Int = if (a != null) a.length else "a is null"
Kotlinのエルビス演算子はnullの安全性のために使用されます。
x = a ?: b
上記のコードでは、x
の値が割り当てられることになるa
でない場合null
とb
場合a
ですnull
。
エルビス演算子を使用しない場合の同等のkotlinコードは次のとおりです。
x = if(a == null) b else a