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

Cha*_*ltz 0 android kotlin

我是Kotlin的新手,但我非常喜欢它.当你可以将三行代码合二为一时,会有一种美妙的感觉.现在我经常发现自己正在查看我的代码并思考"这里有一些冗余.应该有一种更简洁的方法来实现它." 当我做一些搜索时,Kotlin经常提供更简洁的方式.

这是一个问题,我感觉应该有一个简单,简洁的Kotlin解决方案,但我不知道它.希望你能开导我!

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

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

根据if条件,我想运行一些代码,然后返回条件的值.令我烦恼的是,我必须明确说"如果条件成立,则返回true.如果是假,则返回false." 这似乎是多余的.当然,我可以说return randomInt % 2,但我想根据它是否真实运行代码.

是否有一个我不知道的魔术师Kotlin?我是否应该为我处理这种情况,尽管调用的语法与if语句不同?是否有某种映射功能,或某种方式重载如果?似乎应该有一个简洁,聪明的答案,但它不会来找我.

Pix*_*ant 6

您可以稍微重构一下代码,以便返回和代码发生在不同的地方:

fun doSomething(): Boolean {
    val isEven = randomInt % 2 == 0

    if (isEven) foo = Foo() else bar = null 

    return isEven
}
Run Code Online (Sandbox Code Playgroud)

  • 叫我白痴,但我真的没有得到其他答案.为什么你会从`if`中复制返回`true`和`false`过于复杂?这个问题本来就不应该存在,正如这个答案所证明的那样(在C和Java中也能很好地工作) (2认同)

Cha*_*ltz 5

我赞成一些答案。我应该考虑将条件拆分为变量或在条件之后进行真/假测试。

但是在睡了之后,我有另一个解决方案。

新的实用功能:

fun Boolean.onTrue(block: () -> Unit): Boolean {
    if (this) block()
    return this
}

fun Boolean.onFalse(block: () -> Unit): Boolean {
    if (!this) block()
    return this
}
Run Code Online (Sandbox Code Playgroud)

然后我的原始代码示例可以浓缩为:

fun doSomething() = (randomInt % 2).onTrue { foo() }.onFalse { bar = null }
Run Code Online (Sandbox Code Playgroud)

这是最简洁的选项,尽管它有其自身的缺点。没有什么可以阻止用户调用onTrue()两次或onFalse()之前调用onTrue()。它看起来与标准完全不同的if / else,如果你使用这两个路径,都onTrue()onFalse()要检查的条件。然后,当然,记得使用新的实用程序函数而不是标准的 Kotlin 运算符。尽管如此,它仍然具有吸引人的简洁性。我有兴趣看看其他人的想法。