首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Detekt检查多个值的可空性的安全方法

使用Detekt检查多个值的可空性的安全方法
EN

Stack Overflow用户
提问于 2021-01-27 20:47:45
回答 1查看 94关注 0票数 1

我使用Danger Detekt (基于ktlint的静态代码质量度量系统)。我有一个函数可以从8个不同的端点获取数据。然后,我需要检查这些值是否不为null,如果是,则返回使用这些值构建的复杂数据类型,但如果这些值中的任何一个为null,则必须返回null。假设它看起来像这样:

代码语言:javascript
复制
val first = endpoint.get()
...

然后我可以用复杂的if语句来检查它,但Detekt会抱怨复杂的条件。所以我把它改成这样:

代码语言:javascript
复制
val first = endpoint.get() ?: return null
...

但是Detekt现在抱怨太多的返回语句,因为我必须将它添加到每次提取中。

有没有什么方便的Kotlin函数来解决这类问题?

EN

回答 1

Stack Overflow用户

发布于 2021-01-28 00:59:47

您可以使用fold来收集每个get的结果,但是在遇到空结果时立即让累加器null (并在尝试每次get调用之前进行检查)。所以它锁住了一个失败的状态:

代码语言:javascript
复制
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

就我个人而言,我认为这种水平的解释意味着,可能只是几个早期的回报更容易理解,而且当它们排列在一起时,可能看起来也整洁得多。不过还是由你决定吧!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65919513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档