如何理解Kotlin中的趣味?
我知道像Code 0一样的标准乐趣。
代码1是来自网页的示例代码,我完全不能理解
fun convertFromDomain(forecast: ForecastList) = with(forecast) {...}
为什么符号=添加到乐趣? 并且是有趣的convertFromDomain单元的返回值?
代码0
fun My(forecast: ForecastList):Boolean { ... return true; }
代码1
data class ForecastList(val id: Long, val city: String, val country: String, val dailyForecast: List<Forecast>) { val size: Int get() = dailyForecast.size operator fun get(position: Int) = dailyForecast[position] } data class Forecast(val id: Long, val date: Long, val description: String, val high: Int, val low: Int, val iconUrl: String) fun convertFromDomain(forecast: ForecastList) = with(forecast) { val daily = dailyForecast.map { convertDayFromDomain(id, it) } CityForecast(id, city, country, daily) }
块体
考虑这个功能:
fun sum(a: Int, b: Int): Int { return a + b }
行为在块体中定义。 它有一个显式的返回类型( Int
)和一个显式的return
语句。 这两个都是强制性的。 如果不明确指定返回类型,则默认情况下它将为Unit
,并且由于a + b
的推断类型为Int
所以不会进行编译。
表达的身体
如果你这样写
fun sum(a: Int, b: Int) = a + b
您不需要指定返回类型,因为可以从表达式推断返回类型。您不需要返回语句,因为返回的是最后一个表达式。 =
符号后面的内容称为表达式体 。
所以,这两个功能都是一样的。 第二个只写得比较简洁。
注意
一个常见的错误就是像这样一次使用它们:
fun sum(a: Int, b: Int) = { a + b }
如果你明确地写出返回的类型,这将会变得清晰:
fun sum(a: Int, b: Int): (Unit) -> Unit = { a + b }
你实际上会返回一个肯定不是你想要的lambda。
一个function
在kotlin中通常具有以下形式:
fun name([parameters])[: return_type] { // function-body } eg fun doubleTheValue(number: Int): Int { return number * 2 }
如果你的函数体只是一个单一表达式,你可以使用一个较短的函数声明
fun name([parameters])[: return_type] = [expression] eg fun doubleTheValue(number: Int): Int = nummber * 2 fun doubleTheValue(number: Int) = nummber * 2 // type can also be inferred
所以没什么特别的,只是一个函数声明的较短版本。
传统的定义函数的方式就像你在代码0中写的那样,它由函数名,参数,返回类型和块体组成。 在Kotlin中,函数可以用表达式体定义,返回类型可以从表达式体中推断出来。
假设有一个以传统方式将Boolean
转换为Int
的函数:
fun Boolean.toInt(): Int { return if (this) 1 else 0 }
它可以简化为:
fun Boolean.toInt() = if (this) 1 else 0
其中返回类型被推断为Int
因为1
和0
都是Int
,将从表达式if (this) 1 else 0
。