如何理解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因为10都是Int ,将从表达式if (this) 1 else 0