如何在Kotlin中了解=的乐趣?

时间:2017-09-29 08:00:52

标签: 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)
}

3 个答案:

答案 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,因为10都是Int,它们将从表达式if (this) 1 else 0返回。