什么时候应该使用let {},什么时候只是简单的!= null
你会怎么写更多的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,但是我觉得这会让代码更难理解
- 通用共享代码 – 在这种情况下,错误报告和返回失败结果 – 可以合并到本地函数中 。
- 导致返回的可空性(在这种情况下,
s3data
可为空)通常可以用返回的?:elvis操作符来替换。 - 当反复输入相同的variables(在这种情况下,访问
s3data
)时,run
块是适当的。 如果感到困惑,请参阅Kotlin的“接收器”是什么? - 正如另一个答案中所述,如果/ else块是Kotlin中的一个expression式。
因此,我认为下面的实现是最具意义的,这要根据本地函数的参数命名:
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()}") } }
你的问题与代码审查相关,所以你可能也很高兴知道有一个专门的Stack Exchange网络。 不过,请先阅读Stack Overflow用户的代码审查指南 。
if
/ else
是Kotlin中的一个expression式 ,所以下面的肯定是更多的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 }