返回if / else条件的值,还要运行代码

我是Kotlin的新手,但我很害怕它。 当你可以将三行代码合并成一个代码时,会有一种奇妙的感觉。 现在我经常发现自己正在看我的代码,并想“这里有一些冗余,应该有一个更简洁的方法来做到这一点”。 而当我做一些搜索时,Kotlin经常提供一个更简洁的方法。

这里有一个问题,我觉得应该有一个简单,简洁的Kotlin解决方案,但是我没有意识到。 希望你能开导我!

像这个人为的例子一样的代码:

fun doSomething(): Boolean { if (randomInt % 2 == 0) { foo = Foo() true } else { bar = null false } } 

基于if条件,我想运行一些代码,然后返回条件的值。 这让我感到困扰,我必须明确地说:“如果条件是真的,那么返回true ,如果是false,则返回false 。 这似乎是多余的。 当然,我可以说是return randomInt % 2 ,但我想运行的代码是否是真的。

Kotlin有一个我不知道的魔术师吗? 我应该为我处理这种情况,尽管调用的语法与if语句有所不同吗? 有没有某种映射函数,或者某种方式来重载? 似乎应该有一个简洁,聪明的答案,但它不是来到我身上。

你可以重构你的代码,以便返回和代码发生在不同的地方:

 fun doSomething(): Boolean { val isEven = randomInt % 2 == 0 if (isEven) foo = Foo() else bar = null return isEven } 

您可以从Kotlin的标准库中探索一些有用的扩展功能。 例如,你可以使用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 } 

更新:如果你喜欢更易读的代码,这不是一个好的解决方案。 玩的开心 :)

我提出了一些答案。 我应该考虑把条件分解成一个变量,或者在条件之后进行真/假测试。

但睡过之后,我有另一种解决办法。

新的实用功能:

 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()调用onTrue()两次或者在onFalse()之前调用onTrue() 。 它看起来与标准的if / else完全不同,如果你使用两个路径, onTrue()onFalse()都必须检查条件。 然后,当然,还记得使用新的效用函数,而不是标准的Kotlin运算符。 不过,它有一个吸引人的简洁。 我会有兴趣看看其他人的想法。

其实很简单,你只需要习惯Kotlin的stdlib功能,比如applyletlet 。 在这种情况下, apply就是你所需要的:

 fun idiomatic(myInt: Int) = (myInt % 2 == 0).apply { if (this) println("is equal") else println("in not equal") } 

会发生什么事情:在Any对象上调用apply,在这种情况下, Boolean (条件),直接变成函数接收器 ,称为this 。 重要的是,在提供的代码块被执行后, apply将返回它的接收器,这是你的Boolean

我希望这是你所需要的!

像素大象的解决方案看起来简洁而好。

但是,从干净的代码角度来看, doSomething()函数正在做两件事情。

如果可能的话,可以将它分成两个函数,并将if检查移到最顶层的函数:

 if ( randomInt.isEven() ) { doSomethingEven() // ... } else { doSomethingOdd() // ... }