什么时候应该使用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 }