我使用Danger Detekt (基于ktlint的静态代码质量度量系统)。我有一个函数可以从8个不同的端点获取数据。然后,我需要检查这些值是否不为null,如果是,则返回使用这些值构建的复杂数据类型,但如果这些值中的任何一个为null,则必须返回null。假设它看起来像这样:
val first = endpoint.get()
...然后我可以用复杂的if语句来检查它,但Detekt会抱怨复杂的条件。所以我把它改成这样:
val first = endpoint.get() ?: return null
...但是Detekt现在抱怨太多的返回语句,因为我必须将它添加到每次提取中。
有没有什么方便的Kotlin函数来解决这类问题?
发布于 2021-01-28 00:59:47
您可以使用fold来收集每个get的结果,但是在遇到空结果时立即让累加器null (并在尝试每次get调用之前进行检查)。所以它锁住了一个失败的状态:
typealias Result = String
data class Endpoint(val name: String, val result: Result?) {
fun get(): Result? {
println("Getting endpoint $name - result is $result")
return result
}
}
val endpoint1 = Endpoint("One", "Result 1")
val endpoint2 = Endpoint("Two", null)
val endpoint3 = Endpoint("Three", "Result 3")
val endpoints = listOf(endpoint1, endpoint2, endpoint3)
// I heard yr linter hates returns
fun resultCollector(results: List<Result>?, endpoint: Endpoint) =
results?.run {
endpoint.get()?.let { results.plus(it) }
}
fun main() {
endpoints.fold(emptyList<Result>(), ::resultCollector)
}
>> Getting endpoint One - result is Result 1
Getting endpoint Two - result is null
(end)您可以使用lambda而不是函数引用,但我只想让它变得清晰-您通过文件夹传递一个结果列表,然后函数执行几次空检查(检查results列表,检查get调用的结果)。这两个检查都可以计算为null,这就是函数将作为下一个累加器返回的内容-只有在没有命中null的情况下才会执行端点代码(并返回实际的Result
就我个人而言,我认为这种水平的解释意味着,可能只是几个早期的回报更容易理解,而且当它们排列在一起时,可能看起来也整洁得多。不过还是由你决定吧!
https://stackoverflow.com/questions/65919513
复制相似问题