我怎样才能使用回报,而不是让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)types不匹配:推断types是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!!)
- AccessToken.getCurrentAccessToken()总是在Kotlin中返回null
- 用于将方法参数分配给Android Studio中的字段的Kotlin快捷方式
- 如何在Kotlin中调用JTable.getColumn
- “这个项目附带的一些Kotlin库有不支持的格式。请更新库或插件”
- 如何在kotlin中使用elvis运算符时否定布尔expression式?
- 我怎样才能直接从Kotlin源使用Java String方法(split)?
- Kotlin用集合中的lastOrNull()替换isEmpty()和last()
- 从lambdas或Kotlin返回:“返回”不允许在这里
- 折叠列表与kotlin中的解构赋值配对