Kotlin-函数和lambda表达式学习笔记

1.Kotlin函数可以使用中缀表示法来调用,当满足一下条件时:

infix fun Int.add(x:Int):Int{
    return this+x
}

fun printAdd(){
    val value=2 add 3//中缀表示法调用add函数(不用加".")
    print("the value is $value")
}

2.在Kotlin中,调用函数的时候可以使用命名的参数:

fun foo(arg1:String="Hello Kotlin",arg2:Boolean,arg3:Int){
    print("arg1="+arg1+"&arg2="+arg2+"arg3="+arg3)
}

fun printFoo(){
    foo(arg2 = true,arg3 = 7)//命名参数调用foo函数
}

3.Kotlin函数定义可变数量的参数,只要用vararg关键字修饰即可:

//可变数量的参数
fun foo4(vararg args:Int){
    for (arg in args){
        print(arg.toString()+",")
    }
}

fun printFoo4(){
    foo4(1,2,3,4,5)//1,2,3,4,5,
}

4.Kotlin函数以数组的内容作为参数,只要用伸展(spread)操作符(在数组前面加 *):

fun foo4(vararg args:Int){
    for (arg in args){
        print(arg.toString()+",")
    }
}

fun printFoo4(){
    val values= intArrayOf(1,2,3,4,5)
    foo4(*values)//使用扩展运算符传一个数组给可变参数
}

5.高阶函数

高阶函数可以将一个函数作为参数或返回值:

fun add2(x:Int=0,y:Int=0):Int{
    return x+y
}

fun operate(x:Int=0,y:Int=0,body:(Int,Int)->Int){//body是一个函数类型,传入两个Int类型参数,返回一个Int类型参数
    print("this result is "+body(x,y))
}

fun getValue(){
    operate(3,7,::add2)
}

6.Lambda表达式

Lambda表达式通常使用“{ }”包围,参数是定义在“()”内,实体部分跟在“->”后面;
以上的operate()方法,我们还有一个更简洁的调用方式,即传入一个lambda表达式:

operate(3,7,{x,y->x+y})//函数参数传入一个lambda表达式

当函数参数是最后函数的最后一个参数,并且你传入一个lambda表达式作为相应的参数,则可以在圆括号之外指定它:

operate(3,7){//函数参数作为函数的最后一个参数,并且传入的是一个lambda表达式,可以在在圆括号外指定
        x,y->x+y

如果lambda表达式只有一个参数,kotlin可以自己计算出签名,它允许我们不声明唯一的参数,并且隐含的为我们声明其名称为it:

fun upCase(str:String,body:(String)->String):String{//body是一个函数参数,传入一个String类型参数,返回一个String类型
    return body(str)
}
fun transform(){
    upCase("HelloKotlin"){//函数字面值只有一个参数,可以省略参数声明,其名称是it
        it.toUpperCase()
    }
}

如果lambda表达式是调用的唯一参数,则调用中的圆括号可以完全省略。

7.匿名函数

匿名函数与常规函数一样,只是省略了函数名称:

fun String.upper(body:(String)->String):String{
    return body(this)
}

fun transform(){
    "HelloKotlin".upper { it.toUpperCase() }//lambda表达式是调用的唯一参数,则调用的圆括号可以省略
    "HelloKotlin".upper(fun(str:String):String{//将匿名函数作为一个函数参数传入
        return str.toUpperCase()
    })
}

匿名函数 与 Lambda表示式区别:

  • 匿名函数作为参数,一般定义在“()”中;而Lambda表达式可以定义到调用函数“()”外。
  • 另外区别在“非局部返回(non-local returns)”行为上:非标签注解的return(返回对应的最内层的函数(即fun)),在匿名函数中,退出该匿名函数;而在Lambda表达中,退出包含该表达式的函数。
fun foo() {
    ints.forEach {
        if (it == 0) return//这个 return 表达式从最直接包围它的函数即 foo 中返回。
        print(it)
    }
}
fun transform():String{
    "HelloKotlin".upper {
        print(it.toUpperCase())
        return@upper it.toUpperCase()//返回必须加标签限制
    }
    "HelloKotlin".upper(fun(str:String):String{
        return str.toUpperCase()//从匿名函数返回
    })
}

8.内嵌函数

作为自变量接收的函数令人讨厌的是编译器需要为它们创建类,这将影响性能。但是,这可以用保留字inline容易地解决。

由于Inline函数是在编译时将它的代码替换对它的调用,所以在性能方面影响较少。为此,它不需要用额为的对象。

我们能够转换doAsync到一个inline函数:

inline fun doAsync(crossinline f: () -> Unit) {
    Thread({ f() }).start()
}

在这个例子中,由于我们从另一个执行内容(另一个Lambda表达式)中调用f(),所以要求crossinline。不用太担心这些,在需要使用它时,编译器会提醒你的。

现在,在我们的代码中,产生异步代码块:

doAsync { 
    op1()
    op2()
    op3()
}

这样在{}内的每件事都将在第二个线程中执行。

参考文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352

推荐阅读更多精彩内容