我知道像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)
}
答案 0 :(得分:7)
阻止身体
考虑这个功能:
fun sum(a: Int, b: Int): Int {
return a + b
}
行为在块体中定义。它具有显式返回类型(Int
)和显式return
语句。 这两者都是强制性的。如果您没有明确指定返回类型,默认情况下它将是Unit
,因为a + b
的推断类型是Int
它不会编译。
表达正文
如果你这样写的话
fun sum(a: Int, b: Int) = a + b
您不需要指定返回类型,因为它可以从表达式中推断出来。因为返回了最后一个表达式,所以不需要return语句。 =
符号后面的内容称为表达主体。
因此,两个函数都做同样的事情。第二个只是写得更简洁。
注意强>
一个常见的错误就是像这样一次使用它们:
fun sum(a: Int, b: Int) = { a + b }
如果你明确地写下返回的类型,那么这将会变得清晰:
fun sum(a: Int, b: Int): (Unit) -> Unit = { a + b }
你实际上会返回一个肯定不是你想要的lambda。
答案 1 :(得分:4)
function
在kotlin中通常采用以下形式:
fun name([parameters])[: return_type] {
// function-body
}
e.g.
fun doubleTheValue(number: Int): Int {
return number * 2
}
如果你的函数体只是一个单表达式,你可以使用较短版本的函数声明
fun name([parameters])[: return_type] = [expression]
e.g.
fun doubleTheValue(number: Int): Int = nummber * 2
fun doubleTheValue(number: Int) = nummber * 2 // type can also be inferred
所以它没有什么特别之处,只是一个较短版本的函数声明。
答案 2 :(得分:0)
定义函数的传统方式就像您在 Code 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
返回。