Kotlin 我应该在什么时候使用let{},什么时候使用plain!=无效的

Kotlin 我应该在什么时候使用let{},什么时候使用plain!=无效的,kotlin,kotlin-null-safety,Kotlin,Kotlin Null Safety,您将如何以更kotlinic的方式编写以下代码 var returnValue = ... val s3data = presignedUrl.body() if (s3data != null) { val uploadImage = api.uploadImage(s3data.bucketUrl, s3data.awsAccessKeyId, s3data.policy, s3data.key, s3data.signature, body).execute() if (!

您将如何以更kotlinic的方式编写以下代码

var returnValue = ...
val s3data = presignedUrl.body()
if (s3data != null) {
    val uploadImage = api.uploadImage(s3data.bucketUrl, s3data.awsAccessKeyId, s3data.policy, s3data.key, s3data.signature, body).execute()
    if (!uploadImage.isSuccessful) {
        crashReporterService.sendIssue("Failed uploading file", "Failed uploading file ${uploadImage.raw()}")
        returnValue = Result.FAILURE
    } else {
        returnValue = Result.SUCCESS
    }
} else {
    crashReporterService.sendIssue("Failed uploading image", "Error - ${presignedUrl.raw()}")
    returnValue = Result.FAILURE
}

return returnValue
我可以使用let,但我觉得它使代码更难理解,因此以下内容肯定更为Kotlinesque:

val s3data = presignedUrl.body()
return if (s3data != null) {
    val uploadImage = api.uploadImage(s3data.bucketUrl, s3data.awsAccessKeyId, s3data.policy, s3data.key, s3data.signature, body).execute()
    if (!uploadImage.isSuccessful) {
        crashReporterService.sendIssue("Failed uploading file", "Failed uploading file ${uploadImage.raw()}")
        Result.FAILURE
    } else {
        Result.SUCCESS
    }
} else {
    crashReporterService.sendIssue("Failed uploading image", "Error - ${presignedUrl.raw()}")
    Result.FAILURE
}
  • 公共共享代码(在本例中是错误报告和返回失败结果)可以合并到一个数据库中
  • 导致返回的可为空性(在本例中,
    s3data
    可为空)通常可以替换为返回
  • 当反复输入同一变量时(在本例中,访问
    s3data
    ),一个块是合适的。如果感到困惑,请参阅
  • 如另一个答案中所述,if/else块是Kotlin中的表达式
因此,我会发现以下实现最具意识形态性,但需要对本地函数的参数进行正确命名:

fun foo() {
    fun failure(p0: String, p1: String) = crashReporterService.sendIssue(p0, p1).let { Result.FAILURE }
    val s3data = presignedUrl.body() ?: return failure("Failed uploading image", "Error - ${presignedUrl.raw()}")
    val uploadImage = s3data.run { api.uploadImage(bucketUrl, awsAccessKeyId, policy, key, signature, body).execute() }

    return if (uploadImage.isSuccessful) {
        Result.SUCCESS
    } else {
        failure("Failed uploading file", "Failed uploading file ${uploadImage.raw()}")
    }
}

您的问题接近于代码审查,因此您可能也会很高兴知道之前有一个Do read,但是。

关于您的代码的说明:尽快返回是一个很好的做法,可以减少范围并简化逻辑