1.函数
Kotlin 函数使用 fun 关键字声明:
fun double(x: Int): Int {
return 2 * x
}
1.1 函数用法
调用函数与调用对象函数:
val result = double(2)
Stream().read() // 创建类 Stream 实例并调用 read()
1.1.1 参数
函数参数使用 Pascal 表示法定义——name: type。参数用逗号隔开, 每个参数必须有显式类型:
fun powerOf(number: Int, exponent: Int): Int {
/*……*/ }
1.1.2 默认参数
函数参数可以有默认值,当省略相应的参数时使用默认值。这可以减少重载数量:
fun read(
b: ByteArray,
off: Int = 0,
len: Int = b.size,
) {
/*……*/ }
覆盖方法总是使用与基类型方法相同的默认参数值。 当覆盖一个有默认参数值的方法时,必须从签名中省略默认参数值:
open class A {
open fun foo(i: Int = 10) {
/*……*/ }
}
class B : A() {
override fun foo(i: Int) {
/*……*/ } // 不能有默认值。
}
如果在默认参数之后的最后一个参数是 lambda 表达式,那么它既可以作为具名参数在括号内传入,也可以在括号外传入:
fun foo(
bar: Int = 0,
baz: Int = 1,
qux: () -> Unit,
) {
/*……*/ }
foo(1) {
println("hello") } // 使用默认值 baz = 1
foo(qux = {
println("hello") }) // 使用两个默认值 bar = 0 与 baz = 1
foo {
println("hello") } // 使用两个默认值 bar = 0 与 baz = 1
1.1.3 具名参数
当一个函数参数都有默认值的情况下,我们可以指定只传入某个参数,例如:
fun reformat(
str: String,
normalizeCase: Boolean = true,
upperCaseFirstLetter: Boolean = true,
divideByCamelHumps: Boolean = false,
wordSeparator: Char = ' ',
) {
/*……*/ }
fun main(){
reformat(
"String!",
upperCaseFirstLetter = false //只传入某个参数
)
}
1.1.4 返回 Unit 的函数
如果一个函数并不返回有用的值,其返回类型是 Unit。Unit 是一种只有一个值——Unit 的类型。 这个值不需要显式返回:
fun printHello(name: String?): Unit {
if (name != null)
println("Hello $name")
else
println("Hi there!")
// `return Unit` 或者 `return` 是可选的
}
//同样 不声明:Unit也可以
fun printHello(name: String?){
if (name != null)
println("Hello $name")
else
println("Hi there!")
}
1.1.5 单表达式函数
当函数返回单个表达式时,可以省略花括号并且在 = 符号之后指定代码体即可:
fun double(x: Int): Int = x *