什么是科特林这种表达的相同呢?
a ? b : c
这是不是在科特林有效的代码。
什么是科特林这种表达的相同呢?
a ? b : c
这是不是在科特林有效的代码。
在科特林, 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
是一个声明,这可能显得不自然,但这种感觉很快就会消退。
你可以定义自己的Boolean
扩展函数返回null
当Boolean
是false
以提供类似于三元运算符的结构:
infix fun <T> Boolean.then(param: T): T? = if (this) param else null
这将使一个a ? b : c
a ? b : c
表达式转换到a then b ?: c
,如下所示:
println(condition then "yes" ?: "no")
更新:但是做更多的类似Java的条件开关,您将需要类似的东西
infix fun <T> Boolean.then(param: () -> T): T? = if (this) param() else null
println(condition then { "yes" } ?: "no")
的拉姆达关注。 其含量的计算应推迟,直到我们确认condition
是true
这一个看似笨拙, 这就是为什么有高要求的要求存在端口的Java三元操作成科特林
if (a) b else c
是可以代替使用Java表达的是什么a ? b : c
a ? b : c
。
在科特林,许多控制语句,包括if
, when
,甚至try
可以作为表达式 。 这意味着那些可具有可被分配给一个变量的结果,从函数返回等
其结果是, 科特林不需要三元运算符 。
if (a) b else c
是可以代替使用Java表达的是什么a ? b : c
a ? b : c
。
我认为这个想法是,后者的可读性,因为每个人都知道什么ifelse
呢,而? :
? :
如果你不familar的语法已经是相当不方便。 虽然我不得不承认,我往往错过了更方便的三元运算符。
其他替代品
什么时候
你也可以看到很多when
构造只要条件科特林检查。 这也是表达的另一种方式的if-else级联的方式。 下面对应的例子。
when(a) {
true -> b
false -> c
}
扩展
由于许多很好的例子( 科特林三元条件运算符在其他的答案)显示,扩展,也可以很长的路要走。
至于我自己,我用下面的扩展功能:
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
如果对象第一个将返回提供的缺省值等于空。 其次将评估在相同的情况下,在lambda表达式提供。
用法:
1) e?.getMessage().or("unknown")
2) obj?.lastMessage?.timestamp.or { Date() }
就个人而言,我上面的代码超过可读if
建设内联
在科特林,
if
是表达式,即,它返回一个值。 因此,不存在三元运算符(condition ? then : else)
,因为普通,如果在这个角色优良工程。 从这里手动源
// 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
有一个在科特林没有三元运算符 ,如if else
块返回值
所以,你可以这样做: val max = if (a > b) a else b
,而不是Java的max = (a > b) ? b : c
max = (a > b) ? b : c
我们也可以使用when
施工,还返回值:
val max = when(a > b) {
true -> a
false -> b
}
这里是链接科特林文档: 控制流:如果到时候,因为,虽然
看看在文档 :
在科特林,如果是表达式,即,它返回一个值。 因此,不存在三元运算符(条件则:人),因为普通,如果在这个角色优良工程。
一些极端情况在其他的答案没有提及。
由于外观takeIf在科特林1.1三元运算符a ? b : c
a ? b : c
也可以这样表示:
b.takeIf { a } ?: c
这变得更短的情况下,c为null
:
b.takeIf { a }
还要注意的是典型的在Java世界null检查类似value != null ? value : defaultValue
value != null ? value : defaultValue
平移ideomatic科特林只value ?: defaultValue
。
类似的a != null ? b : c
a != null ? b : c
可以转换为a?.let { b } ?: c
。
Java的
int temp = a ? b : c;
相当于科特林:
var temp = if (a) b else c
在更换类似C语言的开关操作。 在最简单的形式,它看起来像这样
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> {
print("x is neither 1 nor 2")
}
}
有一个在科特林没有三元操作。 这似乎第一眼问题。 但是,我们认为可以用内联做,如果else语句,因为这是在这里表达。 只是我们要做的 -
var number = if(n>0) "Positive" else "Negetive"
在这里我们可以否则,如果块太多达我们需要的。 喜欢-
var number = if(n>0) "Positive" else if(n<0) "Negative" else "Zero"
因此,这条线是如此的简单,比三元运算符多可读。 当我们在Java中使用一个以上的三元运营商似乎太可怕了。 但在这里,我们有一个清晰的语法。 甚至我们可以在多行就写了。
作为德鲁诺克斯报价,科特林使用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"
你可以做到这一点在科特林多路
如果使用
if(a) b else c
当使用
when (a) { true -> print("value b") false -> print("value c") else -> { print("default return in any other case") } }
空安全
val a = b ?: c
另一个有趣的方法是使用when
:
when(a) {
true -> b
false -> b
}
可以很方便在一些比较复杂的情况。 而且说实话,它更可读,我比if ... else ...
您可以使用var a= if (a) b else c
来代替三元运算符。
科特林的另一个很好的概念是猫王算子。 你并不需要检查空每次。
val l = b?.length ?: -1
这将返回长度。如果B不为空,否则执行右边的语句。
存在科特林没有三元运算符,存在如果表达式:
var d = if (a) b else c
有一个在科特林没有三元操作,但也有一些有趣的方式来解决这一点。 正如其他人所指出的那样,直接翻译成科特林是这样的:
val x = if (condition) result1 else result2
但是,我个人认为可以得到一个有点混乱和难以阅读。 有内置到图书馆借了一些其他的选择。 您可以使用takeIf {}与猫王操作:
val x = result1.takeIf { condition } ?: result2
正在发生的事情则存在takeIf {}命令返回或者您的RESULT1或空,Elvis操作符处理空选项。 有一些额外的选项,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 }
正如你所看到的,科特林提供在你选择如何表达你的代码有很大的灵活性。 还有我的例子无数的变化和可能的方式我还没有发现呢。 我希望这有帮助!
任务 :
让我们看看下面的例子:
if (!answer.isSuccessful()) {
result = "wrong"
} else {
result = answer.body().string()
}
return result
我们需要在科特林以下等价的:
回报(!answer.isSuccessful())
?
“错误”:
。answer.body()字符串()
解决方案 :
1.A。 您可以使用if-expression
在科特林:
return if (!answer.isSuccessful()) "wrong" else answer.body().string()
1.B。 如果你翻车了这个它可以更好if-expression
(让我们做没有not
):
return if (answer.isSuccessful()) answer.body().string() else "wrong"
2。 科特林的Elvis操作符?:
可以更好地做工作:
return answer.body()?.string() ?: "wrong"
3。 或使用Extension function
为相应的Answer
类:
fun Answer.bodyOrNull(): Body? = if (isSuccessful()) body() else null
4。 使用Extension function
,你可以减少由于代码Elvis operator
:
return answer.bodyOrNull()?.string() ?: "wrong"
5。 或者只是使用when
操作人员:
when (!answer.isSuccessful()) {
parseInt(str) -> result = "wrong"
else -> result = answer.body().string()
}
希望这可以帮助。
您可以使用if
在科特林表达这一点。 在科特林if
是与结果值的表达式。 因此,在科特林我们可以这样写
fun max(a: Int, b: Int) = if (a > b) a else b
在Java中,我们可以达到相同的,但具有较大的代码
int max(int a, int b) {
return a > b ? a : b
}
另一个短的方式使用
val value : String = "Kotlin"
value ?: ""
这里科特林本身检查空值,如果它为null,则它传递空字符串值。
为什么人会使用这样的:
when(a) {
true -> b
false -> b
}
当你实际上可以使用这样的( a
是布尔在这种情况下):
when {
a -> b
else -> b
}
在科特林,如果控制流是一个表达式。 因此,它返回一个值。 因此,科特林不提供三元操作符(条件则:其他)。 所以,我们可以写出等效代码。
var v=if(a) b else c
记住三元运营商和Elvis操作符持有科特林不同的意思不像许多流行的语言。 这样做expression? value1: value2
expression? value1: value2
会给你不好的话由科特林编译器,不同于其他任何语言,因为是在提到科特林没有三元运营商 官方的文档 。 究其原因是, 是否和何时的try-catch语句本身返回值。
所以,在做expression? value1: value2
expression? value1: value2
可以被替换
VAL最大=如果(A> B)的打印( “选择”)其他打印( “选择B”)
猫王运算符 科特林了,只能在可空变量前的情况:
如果我这样做
value3 = value1 ?: value2
那么,如果值1为null,则值2将返回值1,否则将被退回。
更加清楚的认识可以实现这些答案 。
在科特林, 没有三元运算符 。
在科特林,如果是表达式,即,它返回一个值。
因此,不存在三元运算符(条件则:人),因为普通,如果在这个角色优良工程。
相当于科特林
var a = if (a) b else c
参考文献 : 控制流:如果到时候,因为,虽然
用下面缀功能,我可以适用于许多常见的使用情况几乎相同的方式,它可以在Python来完成:
class TestKotlinTernaryConditionalOperator {
@Test
fun testAndOrInfixFunctions() {
Assertions.assertThat(true and "yes" or "no").isEqualTo("yes")
Assertions.assertThat(false and "yes" or "no").isEqualTo("no")
Assertions.assertThat("A" and "yes" or "no").isEqualTo("yes")
Assertions.assertThat("" and "yes" or "no").isEqualTo("no")
Assertions.assertThat(1 and "yes" or "no").isEqualTo("yes")
Assertions.assertThat(0 and "yes" or "no").isEqualTo("no")
Assertions.assertThat(Date() and "yes" or "no").isEqualTo("yes")
@Suppress("CAST_NEVER_SUCCEEDS")
Assertions.assertThat(null as Date? and "yes" or "no").isEqualTo("no")
}
}
infix fun <E> Boolean?.and(other: E?): E? = if (this == true) other else null
infix fun <E> CharSequence?.and(other: E?): E? = if (!(this ?: "").isEmpty()) other else null
infix fun <E> Number?.and(other: E?): E? = if (this?.toInt() ?: 0 != 0) other else null
infix fun <E> Any?.and(other: E?): E? = if (this != null) other else null
infix fun <E> E?.or(other: E?): E? = this ?: other
请使用的if-else条件语句或当操作者如下
when(a) {
true -> b
false -> b
}
有一个在科特林没有三元操作,最封闭的是以下两种情况,
val a = true if(a) print("A is true") else print("A is false")
如果表达式的左侧:不为空,Elvis操作符返回它,否则返回表达的权利。 需要注意的是,右侧表达式求值仅在左侧为空。
val name = node.getName() ?: throw IllegalArgumentException("name expected")
参考文档
示例:var能量:INT =数据获得(位置)?.能量.toInt():???0
在科特林如果你使用:它会像如果该语句将返回null则:0将采取0或任何你写这一边。
当与应用(),让三元操作打交道时显得非常方便,因为它是更优雅,给你的房间工作
val columns: List<String> = ...
val band = Band().apply {
name = columns[0]
album = columns[1]
year = columns[2].takeIf { it.isNotEmpty() }?.let { it.toInt() } ?: 0
}
var a:Int=20
var b:Int=5
val c:Int=15
var d=if(a>b)a else c
print("Output is: $d")