Kotlin入门学习记录
2023/11/26
匿名函数
无名函数,如下
//count中传的参数就是匿名函数
var total = "Mississippi".count( { letter ->
letter == 's'
})
函数类型
和Integer String等类型变量声明一样
函数也可以作为一个类型进行声明变量,如下
注意
匿名函数的最后一行为返回值 不用写return
//此处声明了一个无参返回类型为String的函数变量
val blessingFunction:() -> String
blessingFunction = {
var hailday = "new year"
"hello $hailday"
}
利用KT的类型推断特性进行简写,如下
注意
此处与Java中的静态代码块不同
val blessingFunction = {
val hoilday = "new year"
"hello $hoilday"
}
函数参数
(函数参数) -> 返回类型 = 参数变量名 -> ,如下
val blessingFunction:(String) -> String = { name ->
val hoilday = "new year"
"$name hello $hoilday"
}
println(blessingFunction("LY_C"))
it关键字
当匿名函数中只有一个参数时
可以使用it代替函数变量名,如下
val blessingFunction:(String) -> String = {
val hoilday = "new year"
"$it hello $hoilday"
}
println(blessingFunction("LY_C"))
利用KT的类型推断特性进行简写,如下
val blessingFunction = { name ->
val hoilday = "new year"
"$name hello $hoilday"
}
println(blessingFunction("LY_C"))
lambda表达式
在函数类型中赋值的匿名函数就是lambda
参数为函数的函数
就是将函数类型当作参数传递,如下
fun main() {
//函数类型变量
val getDiscountWords = { goodsName:String,hour:Int ->
val currentYear = 2017
"${currentYear}年 ${goodsName} 促销倒计时${hour}小时"
}
showOnBoard("卫生纸",getDiscountWords)
}
fun showOnBoard(goodName:String,getDiscountWords:(String,Int)->String){
val hour = (1..24).shuffled().last()
println(getDiscountWords(goodName,hour))
}
Java中可以使用接口达到类似的效果,如下
public interface GetDiscountWords {
String getDiscountWords(String goodsName,int hour);
}
class Main{
public static void main(String[] args) {
showOnBoard("卫生纸", new GetDiscountWords() {
@Override
public String getDiscountWords(String goodsName, int hour) {
int currentYear = 2017;
return currentYear+"年 "+ goodsName+" 促销倒计时 "+hour+"小时";
}
});
}
public static void showOnBoard(String goodsName, GetDiscountWords g){
int hour = 24;
System.out.println(goodsName+g.getDiscountWords(goodsName,hour));
}
}
简略写法
如果一个lambda参数排在最后或者是唯一参数,圆括号可以省略,如下
fun main() {
//"LY_CY_CY_CY_C".count(){it == 'C'}
"LY_CY_CY_CY_C".count{it == 'C'}
//
showOnBoard("卫生纸",getDiscountWords){goodsName:String,hour:Int ->
val currentYear = 2017
"${currentYear}年 ${goodsName} 促销倒计时${hour}小时"
}
}
fun showOnBoard(goodName:String,getDiscountWords:(String,Int)->String){
val hour = (1..24).shuffled().last()
println(getDiscountWords(goodName,hour))
}
函数内联
关键字
inline
在使用lambda时JVM会自动创建一个实例对象,会加大内存开销严重影响性能,所以引入内联解决这一问题,内联的处理方式就是那里使用粘哪里,如下
fun main(){
showOnBoard("卫生纸"){ goodsName:String,hour:Int ->
val currentYear = 2017
"${currentYear}年 ${goodsName} 促销倒计时${hour}小时"
}
}
inline fun showOnBoard(goodName:String,getDiscountWords:(String,Int)->String){
val hour = (1..24).shuffled().last()
println(getDiscountWords(goodName,hour))
}
注意
lambda的递归函数不能使用内联inline
否则会导致死循环
函数引用
在传递函数类型给函数时除了使用lamdba还可以使用::
引用函数,如下
fun main(){
showOnBoard("卫生纸",::getDiscountWords)
}
fun getDiscountWords(goodsName:String,hour:Int):String{
val currentYear = 2017
return "${currentYear}年 ${goodsName} 促销倒计时${hour}小时"
}
fun showOnBoard(goodName:String,getDiscountWords:(String,Int)->String){
val hour = (1..24).shuffled().last()
println(getDiscountWords(goodName,hour))
}
函数类型为返回值的函数
就是将函数类型当作返回值传递,如下
fun main() {
//此处调用了configDiscountWord函数返回函数类型
var getDiscountWords = configDiscountWord();
println(getDiscountWords("纸巾"))
}
fun configDiscountWord():(String)->String{
val currentYear = 2027
var hour = (1..24).shuffled().last()
return {
hour += 20
"${currentYear}年 {$it} 促销倒计时 ${hour}"
}
}
闭包
匿名函数=lambda=闭包,lambda可以调用自己作用域之外的变量,本质作用是作用域控制?