687

Kotlin でこの式に相当するものは何ですか?

a ? b : c

これは Kotlin では有効なコードではありません。

4

34 に答える 34

880

Kotlin では、ifステートメントは式です。したがって、次のコードは同等です。

if (a) b else c

ここでは、表現とステートメントの区別が重要です。Java/C#/JavaScript ではif、ステートメントを形成します。つまり、値に解決されません。より具体的には、変数に割り当てることはできません。

// Valid Kotlin, but invalid Java/C#/JavaScript
var v = if (a) b else c

がステートメントである言語から来ている場合if、これは不自然に思えるかもしれませんが、その感覚はすぐに治まるはずです。

于 2013-05-02T11:08:15.273 に答える
40

私自身、次の拡張関数を使用します。

fun T?.or<T>(default: T): T = if (this == null) default else this 
fun T?.or<T>(compute: () -> T): T = if (this == null) compute() else this

最初のものは、オブジェクトが null に等しい場合に提供されたデフォルト値を返します。2 番目は、ラムダで指定された式を同じ場合に評価します。

使用法:

1) e?.getMessage().or("unknown")
2) obj?.lastMessage?.timestamp.or { Date() }

if個人的には、上記のコードはインライン展開よりも読みやすい

于 2015-07-08T15:41:39.773 に答える
31

Kotlin では、ifは式です。つまり、値を返します。(condition ? then : else)したがって、この役割では通常の if が正常に機能するため、 三項演算子はありません。ここからマニュアルソース

// Traditional usage 
var max = a 
if (a < b) max = b

// With else 
var max: Int
if (a > b) {
    max = a
} else {
    max = b
}

// As expression 
val max = if (a > b) a else b
于 2017-05-24T05:30:11.613 に答える
27

ドキュメントを見てください:

Kotlin では、if は式です。つまり、値を返します。したがって、通常の if がこの役割でうまく機能するため、三項演算子 (条件 ? then : else) はありません。

于 2016-07-28T06:21:47.710 に答える
12

Drew Noakes が引用したように、kotlin は if ステートメントを式として使用するため、三項条件演算子はもう必要ありません。

ただし、拡張機能と中置のオーバーロードを使用すると、自分で実装できます。例を次に示します

infix fun <T> Boolean.then(value: T?) = TernaryExpression(this, value)

class TernaryExpression<out T>(val flag: Boolean, val truly: T?) {
    infix fun <T> or(falsy: T?) = if (flag) truly else falsy
}

次に、このように使用します

val grade = 90
val clazz = (grade > 80) then "A" or "B"
于 2017-06-07T09:20:32.857 に答える
9

Kotlin には三項演算はありませんが、それを回避する楽しい方法がいくつかあります。他の人が指摘しているように、Kotlin への直接の翻訳は次のようになります。

val x = if (condition) result1 else result2

しかし、個人的には、少しごちゃごちゃしていて読みにくいと思います。ライブラリには、他にもいくつかのオプションが組み込まれています。elvis 演算子で takeIf {} を使用できます。

val x = result1.takeIf { condition } ?: result2

そこで起こっていることは、takeIf { } コマンドが result1 または null を返し、elvis 演算子が null オプションを処理することです。いくつかの追加オプション、takeUnless { } があります。次に例を示します。

val x = result1.takeUnless { condition } ?: result2

言語は明確です、あなたはそれが何をしているのか知っています.

よく使われる条件なら、インライン拡張メソッドを使うなどの面白いこともできます。たとえば、ゲームのスコアを Int として追跡し、特定の条件が満たされない場合は常に 0 を返したいとします。

inline fun Int.zeroIfFalse(func: () -> Boolean) : Int = if (!func.invoke()) 0 else this     

わかりました、それは醜いようです。ただし、使用時にどのように見えるかを検討してください。

var score = 0
val twoPointer = 2
val threePointer = 3

score += twoPointer.zeroIfFalse { scoreCondition } 
score += threePointer.zeroIfFalse { scoreCondition } 

ご覧のとおり、Kotlin は、コードの表現方法を選択する際に多くの柔軟性を提供します。私の例には無数のバリエーションがあり、おそらく私がまだ発見していない方法もあります。これが役立つことを願っています!

于 2018-02-04T21:06:04.927 に答える
4

ifこれには Kotlin で式を使用できます。Kotlin ではif、結果値を持つ式です。だからKotlinで書くことができます

fun max(a: Int, b: Int) = if (a > b) a else b

Javaでも同じことを実現できますが、より大きなコードで実現できます

int max(int a, int b) {
return a > b ? a : b
}
于 2018-01-06T09:41:22.523 に答える
2

なぜこのようなものを使用するのでしょうか:

when(a) {
  true -> b
  false -> b
}

実際にこのようなものを使用できる場合(aこの場合はブール値です):

when {
  a -> b
  else -> b
}
于 2018-07-24T11:40:49.073 に答える