有名函数
函数参数
- 不打算传入值参,可以预先给参数指定默认值
//如果不打算传入值参,可以预先给参数指定默认值
private fun fix(name: String, age: Int = 2) {
println(name + age);
}
//调用的时候
fix("hhhh");
fix("hasee", 30);
- 有名的函数值参,如果使用命名值参,可以不用管值参的顺序
fix(age = 100, name = "华为")//如果使用命名值参,可以不用管参数的顺序
参数的顺序相反了,也不会影响最终结果。
Unit函数
Kotlin中没有返回值的函数叫Unit函数。
Nothing类型
- TODO函数的任务就是抛出异常,就是永远别指望它能运行成功,返回Nothing类型
val i = 30
if (i > 3) {
println(i)
} else {
TODO("argument is too small")
}
反引号中函数名
- kotlin中可以使用空格和特殊字符对函数命名,不过函数名要用一对反引号括起来
fun `**iohguoippmnwjeeinwpeinwini1309-**`() {
println("I am weird.")
}
Android中不允许的
- 为了支持Kotlin和Java互操作,而Kotlin和Java却又保留了各自关键字,不能作为函数名,使用反引号括住就能避免任何冲突
比如:
public class MyJava {
//is在Kotlin中是关键字
public static void is() {
System.out.println("MyJava");
}
public static void isConnect() {
System.out.println("MyJava isConnect");
}
}
如果想在Kotlin中引用,那么要加上反引号
MyJava.`is`();//is在kotlin中是关键字
匿名函数
- 不取名字的函数,我们称之为匿名函数;
- 匿名函数通常整体传递给其他函数,或者从其他函数返回;
- 匿名函数被称为lambda,kotlin中也称lambda为闭包;
参数
- 匿名函数可以不带参数,可以带一个或多个参数
- 带参数时,参数类型放在匿名函数的类型定义中,参数名放在函数体定义中
/**
* 匿名函数声明参数时候,需在括号内声明类型,变量名需写在函数体中
*/
val blessingFunction1: (String) -> String = { name ->
val holiday = "New Year"
"$name, happy ${holiday}"
}
it关键字参数
- 定义只有一个参数的匿名函数时,可以使用it关键字来表示参数名。
- 匿名函数有两个参数时候,it关键字不起作用了
/**
* 匿名函数声明只有一个参数的时候,可以不用在函数体中声明变量名,可以省略
* 可以使用it关键字
*/
val blessingFunction2: (String) -> String = {
val holiday = "New Year"
"$it, happy ${holiday}"
}
匿名函数的类型推断
- 如果已把匿名函数作为变量赋值给函数变量,就不需要显示指明变量类型
不带参数的类型推断
比如下面把一个函数变量赋给一个函数变量类型,这种写法的比较完整的。
val blessingFunction: () -> String = {
val holiday = "New Year"
"happy $holiday"
"happy ${holiday}"
}
使用类型推断可以下面这样来写;不用显示指明匿名函数类型,就表示一个无参的返回值类型为String的函数变量。
val blessingFunction = {
val holiday = "New Year"
"happy $holiday"
"happy ${holiday}"
}
带参数的类型推断
- 匿名函数的参数名和 参数类型必须有
val blessingFunction1: (String) -> String = { name: String ->
val holiday = "New Year"
"$name, happy ${holiday}"
}
使用类型推断可以下面这样来写;不用显示指明匿名函数类型
就表示传入一个String类型参数,返回值类型为String的函数变量。
val blessingFunction1 = { name: String ->
val holiday = "New Year"
"$name, happy ${holiday}"
}
函数类型作为变量
- 匿名函数可以当做变量赋值给函数类型变量,就像其他变量一样,匿名函数可以在代码里传递
- 匿名函数会隐式或自动返回函数体最后一行语句的结果;
/**
* 声明一个函数类型变量
* 函数类型是由参数和返回值决定的
* ()->String : 无参数,返回类型String
* 匿名函数默认最后一行是作为返回值,省略return
*/
val blessingFunction: () -> String = {
val holiday = "New Year"
"happy $holiday"
"happy ${holiday}"
}
函数类型作为值参
传lambda【匿名函数】
- 函数有参数,并且参数是函数类型变量
/**
* 类型推断
*/
val discount2 = { name: String, hour: Int ->
val currentYear = "2027"
"${currentYear}年,双11${name}促销倒计时,还剩${hour}小时。"
}
showOnBoard("卫生纸", discount2);
//具名函数
fun showOnBoard(goodsName: String, showDiscount: (String, Int) -> String) {
val hour = (1..24).shuffled().last();//乱序去最后一位
println(showDiscount(goodsName, hour));
}
- 一个函数的lambda参数排在最后,或者是唯一的参数,那么括住lambda圆括号可以省略
上面的调用可以使用如下的写法;
showOnBoard("卫生纸") { name: String, hour: Int ->
val currentYear = "2027"
"${currentYear}年,双11${name}促销倒计时,还剩${hour}小时。"
}
//具名函数
fun showOnBoard(goodsName: String, showDiscount: (String, Int) -> String) {
val hour = (1..24).shuffled().last();//乱序去最后一位
println(showDiscount(goodsName, hour));
}
传函数引用
- 函数引用可以把一个具名函数转化成值参;使用::操作符,后跟具名函数
/**
* 可以使用函数引用,使用::操作符,后跟要引用的函数名
*/
fun main() {
//
showA("家用电器", ::sh);
}
fun sh(name: String, age: Int): String {
val currentYear = "2027"
return "${currentYear}年,双11,${name}促销活动倒计时还剩${age}小时"
}
fun showA(goodsName: String, sh: (String, Int) -> String) {
val hour = (1..24).shuffled().last();
println(sh(goodsName, hour))
}
函数类型作为返回值
//定义一个函数返回类型
fun showDetail(): (String) -> String {
val currentYear = "2027"
val hour = (1..24).shuffled().last()
//可以引用作用域之外的变量,kotlin中的lambda就是闭包
return { name: String ->
"${currentYear}年,双11,${name}促销活动倒计时还剩${hour}小时"
}
}