Kotlin でこの式に相当するものは何ですか?
a ? b : c
これは Kotlin では有効なコードではありません。
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
、これは不自然に思えるかもしれませんが、その感覚はすぐに治まるはずです。
私自身、次の拡張関数を使用します。
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
個人的には、上記のコードはインライン展開よりも読みやすい
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
ドキュメントを見てください:
Kotlin では、if は式です。つまり、値を返します。したがって、通常の if がこの役割でうまく機能するため、三項演算子 (条件 ? then : else) はありません。
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"
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 は、コードの表現方法を選択する際に多くの柔軟性を提供します。私の例には無数のバリエーションがあり、おそらく私がまだ発見していない方法もあります。これが役立つことを願っています!
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
}
なぜこのようなものを使用するのでしょうか:
when(a) {
true -> b
false -> b
}
実際にこのようなものを使用できる場合(a
この場合はブール値です):
when {
a -> b
else -> b
}