【发布时间】:2019-09-20 00:10:12
【问题描述】:
(为清楚起见进行了编辑)
我发现自己一直在写 (if (x) f() else null) ?: (if (y) g() else null) ?: (if (z) h() else null) 和类似的东西,而且我确定我不是唯一一个人ץ
我总是在寻找像下面定义的valueIf 这样的函数(这是takeIf,参数的顺序颠倒了,所以值是惰性的),这样我就可以编写像getViewEventType2() 这样的代码,而不是像@ 这样的代码987654326@(均在下文详述)。
有没有我遗漏的成语?
(另外,编译器对这样的函数是否聪明,或者我应该担心创建太多的临时闭包?)
private fun getViewEventType1(): String? {
return if (intent.action == "android.intent.action.VIEW") {
intent.data?.pathSegments?.let {
if (it.size == 3 && it[0] == "app" && it[1] == "event") it[2]
else null
}
} else null
}
private fun getViewEventType2(): String? {
return valueIf(intent.action == "android.intent.action.VIEW") {
intent.data?.pathSegments?.let {
valueIf(it.size == 3 && it[0] == "app" && it[1] == "event") { it[2] }
}
}
}
inline fun <T> valueIf(condition: Boolean, func: () -> T?) =
if (condition) func() else null
【问题讨论】:
-
这里的例子和链接的文章可以帮助你:stackoverflow.com/a/48466874/44615
-
我不明白 - 你到底在问什么?这两个似乎都很好。
-
@MartinStone 链接的文章是关于
Kotlin处理可空值调用链的精彩故事。我在问如何将条件组合到这些链中。func().takeIf{condition}可以工作,但不会短路(它会反转你的代码)。 -
-
因为我一直发现自己在写
(if (x) f() else null) ?: (if (y) g() else null) ?: (if (z) h() else null)和类似的东西,而且我确定我不是唯一一个