美文网首页
函数类型、lambda表达式

函数类型、lambda表达式

作者: lqhunter | 来源:发表于2020-09-08 18:54 被阅读0次

一、函数类型

  • 在 Kotlin 里,有一类 Java 中不存在的类型,叫做「函数类型」,这一类类型的对象在可以当函数来用的同时,还能作为函数的参数、函数的返回值以及赋值给变量

  • 所有函数类型都有一个圆括号括起来的参数类型列表以及一个返回类型:(A, B) -> C 表示接受类型分别为 AB 两个参数并返回一个 C 类型值的函数类型。 参数类型列表可以为空,如 () -> A。返回类型为空 Unit 不能省略。

//样式
(参数列表类型) -> 返回值类型

//比如,定义一个函数类型的变量
val sum: (Int) -> Int

//方法中定义 函数类型参数
fun test(age: Int, action: (Int) -> String) {}

如需将函数类型指定为可空,使用圆括号:((Int, Int) -> Int)?

函数类型可以使用圆括号进行接合:(Int) -> ((Int) -> Unit)

箭头表示法是右结合的,(Int) -> (Int) -> Unit 与前述示例等价,但不等于 ((Int) -> (Int)) -> Unit

二、函数类型实例化

//1.lambda表达式
val sum = { a: Int, b: Int -> a + b }

//2.匿名函数
val sum1 = fun(a: Int, b: Int) { a + b }

//3.双冒号,函数引用
fun sumab(a: Int, b: Int): Int {
    return a + b
}

val sum2 = ::sumab

三、lambda表达式

1.基本形式
组成结构
//例如调用上面方法,传入lambda表达式,内部会 自动创建对应的对象
test(12, { it -> "aa" })
2.基本使用
//方法中定义,需要传入 函数类型 的参数
fun test(age: Int, action: (Int) -> String) {
    val result = action(age)
    println(result)
}

//使用此方法
test(12, { it -> "aa" })

3.语法简化
login.setOnClickListener({ v: View ->
    //doSomething
})

//如果Lambda为最后一个参数,可以放到括号外面
login.setOnClickListener() { v: View ->
    //doSomething
}

//lambda是setOnClickListener 单参数,括号省略
login.setOnClickListener { v: View ->
    //doSomething
}

//lambda表达式中参数只有一个,参数省略,如果需要使用,it代替
login.setOnClickListener {
    //doSomething
}

四、匿名函数

//赋值给变量
val add = fun(a: Int, b: Int): Int { return a + b }

val multiply = fun(a: Int, b: Int): Int { return a * b }

fun calculate(action: (Int, Int) -> Int): Int {
    val a = 1
    val b = 2
    return action(a, b)
}

fun main() {

    println(calculate(add))

    println(calculate(multiply))


}

或者直接在参数里创建一个 匿名函数

calculate(fun(a: Int, b: Int): Int { return a + b })

1

五、函数引用

//定义一个普通函数/方法
fun cc(a: Int, b: Int): Int {
    return a + b
}


fun main() {

    //用双冒号创建一个函数类型的对象
    val ccInstance = ::cc

    cc(1, 2) //直接调用函数
    ccInstance(1,2) //用赋值的变量调用
    (::cc)(1, 2) //对象 ::cc 调用,和上面等价

}

对于有相同变量名的重载方法,需要显示指明变量的函数类型才行

fun cc(a: Int, b: Int): Int {
    return a + b
}

fun cc(a: Int, b: Int, c:Int): Int {
    return a + b + c
}

fun main() {
    //显示指明变量具体的函数类型
    val ccInstance1 : (Int, Int) -> Int = ::cc
    val ccInstance2 : (Int, Int, Int) -> Int = ::cc
}

相关文章

  • Kotlin高阶函数的使用

    Lambda表达式 Lambda表达式 函数类型定义 (String,Int)->Unit为一个函数类型,即参数、...

  • 第二章 Lambda表达式

    引入Lambda表达式后: 编写Lambda表达式的不同形式: Lambda表达式本身的类型:函数接口 函数接口 ...

  • lambda表达式及Stream操作

    lambda表达式 by shihang.mai lambda表达式特点 函数式编程 参数类型自动推断 代码量少,...

  • Java8实战中的关键概念

    Lambda 表达式 Lambda 表达式可以理解为一种匿名函数:它没有名称,但有参数列表、函数主体、返回类型,可...

  • Kotlin Lambda表达式

    Lambda表达式是函数类型的对象,实质上是Kotlin匿名函数的一种特殊写法。 Lambda表达式的演化以OnC...

  • java8新特性

    1.lambda表达式 Lambda 允许把函数作为参数传递进方法中 // 类型声明 Math...

  • Java Lambda表达式

    标签(空格分隔):java Lambda表达式是java8的重要更新,Lambda表达式的目标类型必须是函数式接口...

  • java8新特性 部分

    lambda表达式Lambda 表达式是对象,他们必须依附于一类特别的对象类型——函数式接口(functional...

  • Lambda表达式

    Lambda表达式简介: MSDN定义:Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数。 介...

  • Kotlin函数式编程 之内联函数

    在高阶函数中参数如果是函数类型, 则可以接收 Lambda 表达式,而Lambda表达式在编译时被编译成为一个匿名...

网友评论

      本文标题:函数类型、lambda表达式

      本文链接:https://www.haomeiwen.com/subject/zfgwsktx.html