Kotlinでは何をしますか?(エルビス演算子)


98

?:たとえばこの場合はどうなるのかわかりません

val list = mutableList ?: mutableListOf() 

なぜこれに変更できるのですか

val list = if (mutableList != null) mutableList else mutableListOf()

5
nullでない場合は左側を返し、そうでない場合は右側を返します。最初の式は、2番目の式の短い表記です。kotlinlang.org/docs/reference/null-safety.html#elvis-operator
EugenPechanec18年

回答:


115

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.

3
これは本当にクールです。私はこれelvis operator以上他の何かに還元できるとは思っていませんでした。いいね!そしていい説明、ありがとう!
sud0 0719年

87

エルビス演算子は、コロン疑問符で表されます。?:そしてそれは、この構文で使用することができます。

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"
}

この場合、の計算値がgetPotentialNullnullでない場合は、retrieveString;によって返されます。nullの場合、"Secondary Not-Null String"代わりに2番目の式が返されます。

また、右側の式は、左側がnullの場合にのみ評価されることに注意してください。

Kotlinではsecond operandthrow Exception式など、任意の式を使用できます。

return nullVariable ?: throw IllegalResponseException("My inner function returned null! Oh no!")

エルビス演算子という名前は、有名なアメリカの歌手エルビスプレスリーに由来しています。彼の髪型は疑問符に似ています

エルビスQuestionMark

出典:Wojda、I。Moskala、M。KotlinによるAndroid開発。2017. Packt Publishing


83
プレスリー氏を説明するためのプラス1
s1m0nw118年

7
?:)(エルヴィスが笑顔として、それを参照してください)
LeoColman

1
しばらくすると、なぜエルビス演算子と呼ばれるのか理解できません。あなたのイラストは、なぜそれがエルビス演算子と呼ばれるのかを私に知らせました。:)
YohanesAI19年

エルビスについての話は実際に本当ですか?(笑)
Hillcow

@Kerooker彼は笑っていません、?:| より良いIMOになります。
ahmedgalal19年

38

これはエルビス演算子と呼ばれ、実行されます...質問で説明したとおりです。左側が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

10
Javaを使用している場合は、次の略記です。a != null ? a : b
crgarridos18年

9

定義を見てみましょう:

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")

もしあなたが他の場合と同じことを表現するなら、それは読みにくいもっとたくさんのコードになるでしょう。


3

簡単に言えば、あなたには両手があります。あなたは知りたいです、あなたの左手は今働いていますか?左手が機能しない場合、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"

この答えが大好きです。あまりにもきれいすぎて理解できません。
Gk Mohammad Emon

2

基本的に、Elvisの左側が何らかの理由でnullを返す場合、代わりに右側を返します。

すなわち

val number: Int? = null
println(number ?: "Number is null")

したがって、numberがnullない場合はnumberが出力され、そうでない場合は「Numberisnull」が出力されます。


1

Kotlinのエルビス演算子はnullの安全性のために使用されます。

x = a ?: b

上記のコードでは、xの値が割り当てられることになるaでない場合nullb場合aですnull

エルビス演算子を使用しない場合の同等のkotlinコードは次のとおりです。

x = if(a == null) b else a

1

これは少し追加です

X = A ?: B

Xまだなりnull、両方の場合ABに評価null

あなたがしたい場合そのため、X常にあることをnon-null、確認してB常にあるnon-nullか、ということBに常に評価されnon-null、それは関数や式の場合。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.