Kotlin细节九:函数类型与Lambda 表达式

java Lambda

1.Java 的lambda 表达式 是接口式函数。:

  • 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
  • 函数式接口可以被隐式转换为 lambda 表达式。 Lambda 表达式和方法引用(实际上也可认为是Lambda表达式)上。
    如定义了一个函数式接口如下:
@FunctionalInterface
interface GreetingService 
{
    void sayMessage(String message);
}

那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的):

GreetingService greetService1 = message -> System.out.println("Hello " + message);

1.Kotlin 的lambda 表达式

  • Kotlin 的Lambda 表达式 同样适用于 函数式接口,如Runnable ,OnClickListener
  • Kotlin 的Lambda 表达式 必须通过{ } 来包裹不可省略
  • 如果 Lambda 表达式 返回值不是 Unit 。那么默认最后一行 表达式的值就是Lambda 表达式的值
  • 如果参数类型可以推导出出来,那么Lambda 表达式就可以省略参数类型
  • 如果只有一个参数,可以用it 代替。

Kotlin 函数类型

函数类型。它只关心 有几个函数参数,参数的类型是什么,返回值的类型是什么。
所以格式是(XClass,YClass)-> ZClass 。这里的 。Kotlin 啥都可以省略,但是函数类型声明的时候的,这个格式是不可以缩水的 。至于为啥用 “ ->” 来代替: 表示返回值的类型,可能是想看起来更好分辨函数类型。

Kotlin中函数类型有三种实例化 方式:

  • 通过函数名,可以通过 :: Name 或者 obj:: Name
  • 匿名函数类型。
  • Lambda 表达式。
fun get(i:Int):String{
    return "${i*3}"
}
fun main(){
    //   Function1 接口 ,1 代表 只有一个参数 。这个是专门为java平台设计的 。
    val func :Function1<Int,String> = { "预约 ${it*3}" }

    // 使用匿名函数
    val func2 = fun (i:Int):String{
        return "预约 ${i*3}"
    }

    // 使用Lambda 表达式实例化
    val func3 :(Int) -> String =  {i:Int-> "预约 ${i*3}" }
    // 使用Lambda 表达式实例化, 并省略函数类型
    val func3_1 :(Int) -> String =  {i-> "预约 ${i*3}" }
    
    // 使用Lambda 表达式实例化
    // 当只有 匿名函数只有 一个参数时,可以用 it 代替。
    val func4 :(Int) -> String =  { "预约 ${it*3}" }

    // 使用带名称的函数
    val func5:(Int) -> String = ::get

}

需要注意的是,以上的 Lambda 表达式 和 匿名函数 有一点是不同的 。Lambda 表达式
是一个表达式 ,它是有返回值的,默认返回最后一行 。如果需要中止 。需要使用 return @label
来返回

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值