返回if / else条件的值,但也运行代码

时间:2017-08-22 04:01:25

标签: android kotlin

我是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语句不同吗?是否有某种映射功能,或某种方式重载如果?似乎应该有一个简洁,聪明的答案,但它不会来找我。

5 个答案:

答案 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 函数,例如applywith和{{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()
    // ...
}