我是Kotlin的新手,但我非常喜欢它。当你可以将三行代码合二为一时,会有一种美妙的感觉。现在我经常发现自己正在查看我的代码并思考“这里有一些冗余。应该有一种更简洁的方法来实现它。”当我进行一些搜索时,Kotlin经常提供更简洁的方式。
这是一个问题,我感觉应该有一个简单,简洁的Kotlin解决方案,但我不知道它。希望你能开导我!
采用类似这个人为例子的代码:
fun doSomething(): Boolean {
if (randomInt % 2 == 0) {
foo = Foo()
true
} else {
bar = null
false
}
}
基于if
条件,我想运行一些代码,然后返回条件的值。令我困扰的是,我必须明确说“如果条件为真,则返回true
。如果为假,则返回false
。”这似乎是多余的。当然,我可以说return randomInt % 2
,但我想根据它是否为真来运行代码。
Kotlin是否有一个我不知道的魔术师?我应该为我处理这种情况,虽然调用它的语法与if语句不同吗?是否有某种映射功能,或某种方式重载如果?似乎应该有一个简洁,聪明的答案,但它不会来找我。
答案 0 :(得分:6)
您可以稍微重构一下代码,以便返回和代码发生在不同的地方:
fun doSomething(): Boolean {
val isEven = randomInt % 2 == 0
if (isEven) foo = Foo() else bar = null
return isEven
}
答案 1 :(得分:1)
您可以从Kotlin的standard library中探索一些有用的扩展函数。例如,您可以使用apply
:
/**
* Calls the specified function [block] with `this` value as its receiver and returns `this` value.
*/
public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }
此处,randomInt % 2 == 0
将是apply
的返回值。
fun doSomething(): Boolean = (randomInt % 2 == 0).apply { if (this) foo = Foo() else bar = null }
更新:如果您更喜欢更易读的代码,那么这不是一个好的解决方案。玩得开心:))
答案 2 :(得分:1)
实际上非常简单,你只需要习惯Kotlin奇妙的 stdlib 函数,例如apply
,with
和{{1 }}。在这种情况下,您需要let
:
apply
会发生什么:在fun idiomatic(myInt: Int) = (myInt % 2 == 0).apply {
if (this) println("is equal") else println("in not equal")
}
对象上调用apply,在这种情况下为Any
(条件),它直接变为函数 receiver ,称为{{ 1}}。重要的是,Boolean
将在执行提供的代码块之后返回其接收者,这是您的this
。
我希望这就是你所需要的!
答案 3 :(得分:1)
我赞成了一些答案。我应该考虑将条件拆分为变量或在条件之后进行真/假测试。
但是在睡觉之后,我有另一个解决方案。
新的实用功能:
fun Boolean.onTrue(block: () -> Unit): Boolean {
if (this) block()
return this
}
fun Boolean.onFalse(block: () -> Unit): Boolean {
if (!this) block()
return this
}
然后我的原始代码示例可以压缩为:
fun doSomething() = (randomInt % 2).onTrue { foo() }.onFalse { bar = null }
这是最简洁的选择,虽然它有其自身的缺点。在onTrue()
之前,没有任何内容可以阻止用户拨打onFalse()
两次或致电onTrue()
。它看起来与标准if / else完全不同,如果你使用两个路径,onTrue()
和onFalse()
都必须检查条件。然后,当然,还记得使用新的实用程序功能而不是标准的Kotlin运算符。尽管如此,它仍然具有吸引力的简洁性。我有兴趣看看其他人的想法。
答案 4 :(得分:0)
@ pixel-elephant的解决方案看起来简洁明了。
但是,从清洁代码的角度来看,您的doSomething()
函数正在做两件事。
如果可能,您可以将其分为两个功能,并将if检查移至最顶层的功能:
if ( randomInt.isEven() ) {
doSomethingEven()
// ...
} else {
doSomethingOdd()
// ...
}