返回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功能,比如apply
, let
和let
。 在这种情况下, 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() // ... }
- 使用Espresso的Android仪器测试失败:NoSuchMethodError javax.inject.Provider中的get()
- 不寻常的崩溃只有在一些设备 – 异步调用kotlin协同程序
- Kotlin || 无法将库添加到我的应用程序?
- 如何使用界面android在适配器中创建onclick事件?
- 将Kotlin添加到现有Java项目会打破Android Studio gradle消息错误
- 从Java调用Kotlin高阶函数
- 生成错误:错误:执行任务':app:compileLightningLiteDebugKotlin'失败。 >编译错误
- 无法获取Meetup API访问令牌与改造 – Android
- Android LiveData:MutableData从不处于活动状态