1.函数的声明

kotlin中函数的声明和java中有所不同。

1)得有fun关键字修饰,

2)参数的声明方式和变量声明类似 age:Int,先写参数名,后面跟着参数类型

3)  返回值类型写在参数的后面。

//可见性修饰符  函数关键字 方法法名     参数名 参数类型          返回值
private       fun      functionName(age: Int, name: String): String {
    return name   age;
}

2.函数参数

默认值参:如果不打算传入值参,可以预先给参数设定默认值

fun main() {
    //通常调用方式
    fix("xiaohua", 20)
    //age已经给定默认值,此时可以不传参数
    fix("xiaohua")
}
//参数age 给定默认值
fun fix(name: String, age: Int = 18) {
    println(name   age)
}

3.Unit函数

Kotlin中没有返回值的函数叫Unit函数,也就是说他们的返回值是Unit

可以打印一下上面定义的fix函数。打印的值是kotlin.Unit。

  println( fix("xiaohua"))

4.匿名函数

定义时不取名字的函数,被称为匿名函数。

1)具名函数的声明:会显示的使用fun关键字修饰。

//具名函数
fun sayHello(): String {
    return "Hello world!"
}
fun main() {
    //具名函数调用
    println(sayHello())
}

匿名函数:

1)匿名函数虽然没有名字,但是可以赋值给变量,这个变量的类型就是函数类型。就像其他变量赋值那样。

2)和具名函数不一样,匿名函数通常不需要return关键字返回数据。匿名函数会隐式的或自动返回最后一行代码的执行结果。

普通变量赋值:

 val hello: String = "hello"

匿名函数赋值变量:

fun main() {
    //声明一个匿名函数,并赋值给变量sayHello
    val sayHello: () -> String = {
        "Hello world!"
    }
    //匿名函数调用
    println(sayHello())
}

3)匿名函数类型。

普通变量的类型在赋值时就指定了,或者通过类型推断,由编译器在编译器指定变量类型。

那么匿名函数的类型是啥,由啥决定?

匿名函数的类型是由参数和返回值决定的。

fun main() {
    //声明一个匿名函数,并赋值给变量sayHello
    val sayHello: () -> String = {
        "Hello world!"
    }
    //打印函数变量
    println(sayHello)
}

得到的结果是Function0<java.lang.String>

Function0:Function后的数字表示的是参数的个数,0表示无参,1表示一个参数,以此类推。

<java.lang.String> 表示的是匿名函数返回值类型。

5.匿名函数的参数

匿名函数可以不带参数,也可以带一个参数或多个参数。

需要带参数时,参数类型放在匿名函数的类型定义中“()”,参数名放在函数定义中“{}”。

1)一个参数的定义:

fun main() {
    val sayHello: (name: String) -> String = { name ->
        "Hello $name!"
    }
    println(sayHello("HanMei"))
}

当匿名函数的参数只有一个时,可以使用it关键字来表示参数名。当有多个参数时就不能使用了。

fun main() {
    val sayHello: (name: String) -> String = {
        "Hello $it!"
    }
    println(sayHello("HanMei"))
}

2)定义多个参数的匿名函数

fun main() {
    val sayHello: (String, Int) -> String = { name, age ->
        "Hello $name$age"
    }
    println(sayHello("HanMei",18))
}

3)类型推断。

我们知道定义普通变量时,在编码阶段可以不用给变量指定类型。

当我们把匿名函数赋值给变量时,也可以不用指定函数的返回值类型,有编译器进行类型推断。

这时定义匿名函数时的“: () -> String”都可以省略。

无参数时的类型推断:

fun main() {
    val sayHello = {
        "Hello world!"
    }
    println(sayHello())
}

一个参数的类型推断:

参数定义和返回值定义可以省略。但是必须在函数定义中,指定参数类型和参数名。

fun main() {
    val sayHello={ name:String ->
        "Hello $name!"
    }
    println(sayHello("HanMei"))
}

多个参数的类型推断:

fun main() {
    val sayHello = { name: String, age: Int ->
        "Hello $name$age!"
    }
    println(sayHello("HanMei", 18))
}

6.lambda表达式

我们将匿名函数称为lambda函数。将他的定义称为lambda表达式,他的返回结果称为lambda结果

7.定义参数

定义参数是匿名函数的函数:函数的参数是另外一个匿名函数。

1)先定义一个具名函数,接收一个匿名函数为参数。

//定义一个具名函数,接收一个String参数和一个函数参数happyNewYear
//happyNewYear: (name: String, year: Int) -> String 这个就是匿名函数的定义
fun sayhello(name: String, happyNewYear: (name: String, year: Int) -> String) {
    val year = 2022
    //在具名函数中调用传递进来的匿名函数
    println(happyNewYear(name,year))
}

2)定义一个匿名函数,调用具名函数时,当作参数传递过去。

fun main() {
    //定义一个匿名函数
    val happyNewYear = { name: String, year: Int ->
        "${name},happy ${year}!"
    }
    //调用具名函数,并把匿名函数当作参数传递
    sayhello("HanMei", happyNewYear)
}

3)上面的匿名函数可以不单独定义,也可以在调用时定义实现。

这种写法和java中的匿名内部类是不是很像。方法的参数new一个接口,实现接口中的方法。

fun main() {
    sayhello("HanMei", happyNewYear = { name: String, year: Int ->
        "${name},happy ${year}!"
    })
}

4)如果lambda是一个函数的最后一个参数,或者是唯一的参数。那么,括住lambda值参的一对圆括号可以去掉。

fun main() {
    sayhello("HanMei") { name: String, year: Int ->
        "${name},happy ${year}!"
    }
}

8.匿名函数

匿名函数还可以用于扩展Kotlin的内置函数。

count是Kotlin用于计算字符串长度的内置函数。

  val word = "HappyNewYear"
  var count = word.count()

用匿名函数进行扩展

    count =  word.count({ letter ->
        letter == 'a'
    })

我们知道:当函数的最后一个参数或只有一个参数是lambda时,那对圆括号可以省略

count =  word.count { letter -> letter == 'a' }

我们又知道,当参数只有一个时,可以用it代替

count = word.count { it == 'a' }

9.函数的引用

要把函数作为参数传递给其他函数,除了lambda表达式,kotlin还提供了其他方法--函数引用

函数引用可以把一个具名函数转换成一个值参,传递给其他函数。

使用lambda表达式的地方,都可以使用函数引用。

1)首先定义两个具名函数:

happyNewYear就是一个普通函数。

sayhello可以接收一个函数参数。这个函数参数可以接收一个匿名函数,也可以接收一个函数引用。

fun happyNewYear(name: String, year: Int): String {
    return "$name happy $year"
}
fun sayhello(name: String, happyNewYear: (name: String, year: Int) -> String) {
    val year = 2022
    println(happyNewYear(name, year))
}

2) 函数引用的使用:双冒号 函数名,就是这个函数的引用,可以当做值参传递

fun main() {
    //::happyNewYear这个就是函数的引用,
    sayhello("HanMei",::happyNewYear)
}

10.函数类型作为返回类型

一个函数的返回值,可以是另外一个函数,函数类型也是有效的返回值类型。

sayhello是一个无参的方法,返回值类型是(String) -> String,这个表达的意思就是一个参数为String类型,返回值为String类型的匿名函数。

fun sayhello(): (String) -> String {
    return {
        val year = 2022
        "$it happy $year"
    }
}

调用方法:

fun main() {
    //调用sayhello得到这个匿名函数,并赋值给变量happyNewYear
    val happyNewYear = sayhello();
    //happyNewYear就是一个匿名函数,可以直接传参调用
    println(happyNewYear("HanMei"))
}

注意上面的返回匿名函数有这样一句代码,val year = 2022;这个是定义在匿名函数中的。

也可以定义在外边的具名函数中,匿名函数仍然可以访问的到。

fun sayhello(): (String) -> String {
    val year = 2022
    return {
        "$it happy $year"
    }
}

这就是另外一个概念。闭包

在Kotlin中,匿名函数,能修改并引用定义在自己作用域之外的变量,匿名函数引用着定义自身的函数里的变量。也就是说sayhello返回的匿名函数,可以引用定义它的函数sayhello的变量。

Kotlin的lambda就是闭包。

到此这篇关于Kotlin匿名函数使用介绍的文章就介绍到这了,更多相关Kotlin匿名函数内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Kotlin匿名函数使用介绍的更多相关文章

  1. 初探swift语言的学习笔记三(闭包-匿名函数)

    很多高级语言都支持匿名函数操作,在OC中的block也为大家所熟悉,然面在swift里好像是被重新作了一个定义,不叫匿名函数,或block了,而叫闭包。下面配合代码来理解一下swift的闭包强大之处。

  2. Swift4 学习笔记——高级篇

    Static的变量也是自动懒惰初始化的,不需要lazy关键字。getter函数必须返回同类型的值。函数函数嵌套Swift中可以在函数体中定义函数,如果一个函数B只被函数A使用,那可以将B函数定义在函数An内。函数作为参数和返回值因为Swift中函数是对象,所以函数也是可以作为参数传递的。作用是调用传入的函数f,并且记录打印函数f调用的次数。这种情况下,f参数需要被标记为@escaping,否则会有编译错误。继承&多态Swift中只有Class可以继承Swift是单继承的。

  3. Kotlin难点解析:extension和this指针

    扩展是Kotlin语言中使用非常简单的一个特性。关于这个问题,其实我之前的一篇文章[[Kotlin]LambdaandExtension](https://www.jianshu.com/p/d7a...中有提到过。为了解决这个问题,官方提出了两个新的概念:dispatchreceiver和extensionreceiver。extensionreceiver:中文翻译为扩展接收者。为了简化,这里我们将dispatchreceiver简称为DR,将extensionreceiver简称为ER。如果你习惯了

  4. Swift – 具有参数的匿名函数作为回调(语法)

    我正在由苹果潜入Swiftlang,并且有一些调用简单匿名函数的参数作为另一个函数的参数,例如:如何解决?你有错误的关闭语法要么要么要么

  5. android – Kotlin类NoClassDefFoundError崩溃

    我有一个使用以下库的现有Android项目:>Autovalue>Dagger2>RxJava>Retrolambda我正在尝试添加Kotlin支持,以便我可以将项目慢慢迁移到Kotlin.这就是我所做的.>添加了Kotlin依赖.>将其中一个类转换为Kt类并转移到src/main/kotlin/..包中.>在源集中添加了kotlin.sourceSets{main.java.srcDirs=’s

  6. android – Kotlin和Dagger2

    我正在尝试将Kotlin添加到我的项目中,但在启用Kotlin之后我无法构建,因为Dagger2类不再生成.我尝试了第二个项目,我有同样的问题.这些是我为启用Kotlin所做的改变:项目build.gradle:Appbuild.gradle:错误发生在这里:其中不再定义DaggerObjectGraph.任何帮助将不胜感激.解决方法只需删除

  7. android – 在Kotlin中不能使用argb color int值吗?

    当我想在Kotlin中为TextView的textColor设置动画时:发生此错误:似乎在Kotlin中不能将值0xFF8363FF和0xFFC953BE强制转换为Int,但是,它在Java中是正常的:有任何想法吗?提前致谢.解决方法0xFF8363FF是Long,而不是Int.你必须明确地将它们转换为Int:关键是0xFFC953BE的数值是4291384254,因此它应该存储在Long变量中.但这里的高位是符号位,表示负数:-3583042,可以存储在Int中.这就是两种语言之间的区别.在Kotlin

  8. 什么是我可以使用Kotlin的最早的Android API级别?

    我认为这个问题很清楚但是我能在Kotlin上定位的最早API级别是什么?解决方法实际上,任何API级别.这是因为Kotlin被编译为JVM6平台的字节码,所有AndroidAPI级别都支持该字节码.因此,除非您在Kotlin代码中使用任何较新的AndroidAPI,否则它不需要任何特定的API级别.

  9. android – Kotlin数据类和可空类型

    我是Kotlin的新手,我不知道为什么编译器会抱怨这段代码:编译器抱怨测试?.data.length,它说我应该这样做:test?.length.但是数据变量是String,而不是String?,所以我不明白为什么我要把它?当我想检查长度.解决方法表达式test?.data部分可以为空:它是test.data或null.因此,获取其长度并不是零安全的,而是应该再次使用safecalloperator:test?.length.可空性通过整个调用链传播:你必须将这些链写成?.)).e),因为,如果其中一个左

  10. android – Kotlin自定义获取执行方法调用

    像这样的东西:仍在使用Kotlin并且不确定get()方法是否会引用编辑器而不是创建新的编辑器.解决方法第二个属性声明适合您的需要:它有一个customgetter,因此获取属性值将始终执行getter,并且不存储该值.你可能会被等号get()=…

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部