想要聲明一個函數需要使用fun
關鍵字
fun hello() {return println("Hello, world!")
}fun main() {hello()// Hello, world!
}
格式:
fun 方法名(參數1: 參數1類型, 參數2 : 參數2類型, ...): 返回值類型 {方法體return 返回值
}fun 方法名(參數1: 參數1類型, 參數2 : 參數2類型, ...){方法體
}
參數可以有一個或者多個,也可以沒有參數。
舉例
fun sum(x: Int, y: Int): Int {return x + y
}fun main() {println(sum(1, 2))// 3
}
fun printMessageWithPrefix(message: String, prefix: String) {println("[$prefix] $message")
}fun main() {printMessageWithPrefix(prefix = "Log", message = "Hello")// [Log] Hello
}
建議使用小駝峰命名法
默認參數值
fun printMessageWithPrefix(message: String, prefix: String = "Info") {println("[$prefix] $message")
}fun main() {printMessageWithPrefix("Hello", "Log") // [Log] HelloprintMessageWithPrefix("Hello") // [Info] HelloprintMessageWithPrefix(prefix = "Log", message = "Hello")// [Log] Hello
}
如果跳過某一個參數,若果有后續的參數,必須指定參數名字
單一表達式方法
fun sum(x: Int, y: Int): Int {return x + y
}
fun main() {println(sum(1, 2))// 3
}
對單表達式函數,可以進行一下簡化
- 去除返回值類型
- 去除
return
關鍵字 - 去除
{}
- 用
=
連接方法體
fun sum(x: Int, y: Int) = x + yfun main() {println(sum(1, 2))// 3
}
Lambda 表達式
如下方法
fun uppercaseString(str: String): String {return str.uppercase()
}
fun main() {println(uppercaseString("hello"))// HELLO
}
可寫為
fun main() {println({ str: String -> str.uppercase() }("hello"))// HELLO
}
- 方法定義在
{}
內 - 參數后邊跟著
->
->
后邊跟著方法體str
是參數名字String
是參數類型- 返回值為
.uppercase()
方法的返回值類型
固定格式,沒什么可研究的
如果是無參數的Lambda
方法
fun main() {{ println("hello") }() // hello
}
Lambda表達式可以以多種方式使用
- 將lambda分配給稍后可以調用的變量
- 將lambda表達式作為參數傳遞給另一個函數
- 從函數返回lambda表達式
- 單獨調用lambda表達式
賦值給變量
fun main() {val upperCaseString = { string: String -> string.uppercase() }println(upperCaseString("hello"))// HELLO
}
函數類型
對于使用變量接收一個Lambda
函數時,可能需要對函數進行類型定義
- 參數類型寫在
()
內,多個類型用,
分割 - 返回值類型跟在
->
后邊
val upperCaseString1: (String) -> String = { string -> string.uppercase() }
// ↑ ↑
// 參數類型 返回值類型
val upperCaseString2 : () -> String = { "hello" }fun main() {println(upperCaseString("hello"))// HELLO
}
作為參數使用
fun main() {val numbers = listOf(1, -2, 3, -4, 5, -6)val positives = numbers.filter { x -> x > 0 }val negatives = numbers.filter { x -> x < 0 }println(positives) // [1, 3, 5]println(negatives) // [-2, -4, -6]
}
.fileter()
方法接收一個Lambda
方法作為參數
- { x -> x > 0 } 獲取
List
中>0的元素- { x -> x < 0 } 獲取
List
中<0的元素
作為返回值在方法中返回
fun main() {fun toSeconds(time: String): (Int) -> Int = when (time) {
// ↑ ↑ ↑
// toSeconds的參數及類型 ↑ 要返回的lambda函數的返回值類型
// 要返回的lambda函數的參數類型 "hour" -> { value -> value * 60 * 60 }"minute" -> { value -> value * 60 }"second" -> { value -> value }else -> { value -> value }}fun main() {val timesInMinutes = listOf(2, 10, 15, 1)val min2sec = toSeconds("minute")val totalTimeInSeconds = timesInMinutes.map(min2sec).sum()println("Total time is $totalTimeInSeconds secs") // Total time is 1680 secs}
}
Trailing lambdas (后置Lambda)
.fold()
方法接收一個Int
和一個lambda
函數,調用方法時可寫做
println(listOf(1, 2, 3).fold(0, { x, item -> x + item })) // 6
使用后置lambda方式時可寫做
println(listOf(1, 2, 3).fold(0) { x, item -> x + item }) // 6
把
lambda
函數放在()
外