我怎样才能使用回报,而不是让Kotlin?

代码A来自https://github.com/antoniolg/Kotlin-for-Android-Developers/blob/master/app/src/main/java/com/antonioleiva/weatherapp/data/db/ForecastDb.kt

我希望使用return而不是let ,所以我写了Code B,但是Code B不能编译,而且我得到两个错误,为什么?

错误:(30,10)'return'在这里是不允许的

错误:(30,45)类型不匹配:推断类型是CityForecast? 但预计CityForecast

守则A

override fun requestForecastByZipCode(zipCode: Long, date: Long) = forecastDbHelper.use { val dailyRequest = "${DayForecastTable.CITY_ID} = ? AND ${DayForecastTable.DATE} >= ?" val dailyForecast = select(DayForecastTable.NAME) .whereSimple(dailyRequest, zipCode.toString(), date.toString()) .parseList { DayForecast(HashMap(it)) } val city = select(CityForecastTable.NAME) .whereSimple("${CityForecastTable.ID} = ?", zipCode.toString()) .parseOpt { CityForecast(HashMap(it), dailyForecast) } city?.let { dataMapper.convertToDomain(it) } } 

代码B

  override fun requestForecastByZipCode(zipCode: Long, date: Long) = forecastDbHelper.use { val dailyRequest = "${DayForecastTable.CITY_ID} = ? AND ${DayForecastTable.DATE} >= ?" val dailyForecast = select(DayForecastTable.NAME) .whereSimple(dailyRequest, zipCode.toString(), date.toString()) .parseList { DayForecast(HashMap(it)) } val city = select(CityForecastTable.NAME) .whereSimple("${CityForecastTable.ID} = ?", zipCode.toString()) .parseOpt { CityForecast(HashMap(it), dailyForecast) } return dataMapper.convertToDomain(city) } 

convertToDomain期望一个非空的CityForecast而不是可空的CityForecast? 。 所以,使用let是一个更好的方法。 否则,你必须强行打开这样的可空city

 dataMapper.convertToDomain(city!!) 

除此之外,如果要从lambda 返回,则必须使用合格的返回值 :

 return@use dataMapper.convertToDomain(city!!)