Kotlin Lambda

Kotlin Lambda

在探索Kotlin Lambda之前,我们先回顾下Java中的Lambda表达式,Java 的 Lambda 表达式是 Java 8 引入的一项强大的功能,它使得函数式编程风格的代码更加简洁和易于理解。Lambda 表达式允许你以一种更简洁的方式表示实现接口(尤其是函数式接口)的方法。它的主要作用是简化代码、减少冗长的匿名类实现,并使得代码更加灵活。

先看一段代码:

java 复制代码
Runnable runnable = new Runnable() {
       @Override
       public void run() {
           System.out.println("Hello Java");
      }
};

等效为:

java 复制代码
Runnable runnable = () -> System.out.println("Hello Java");

带参数的和带返回值的其实是类似的,只要满足函数式接口都可以使用lambda表达式简化代码,这里就不做过多的介绍了。

Kotlin高阶函数

在了解Kotlin Lambda之前,我们要先了解Kotlin的高阶函数,高阶函数是指满足以下条件之一的函数:

  • 将函数作为参数传递。
  • 返回一个函数作为结果。
kotlin 复制代码
//函数作为参数
fun a(b: () -> Int) {
    b.invoke()
}
//函数作为返回结果
fun c(x: Int): (Int) -> Int {
    return { number -> number * x }
}

fun main() {
    val multiplier = c(2)
    println(multiplier(2))
}

函数引用

在Kotlin中可以使用::对函数进行引用,并且还可以直接引用类似于集合中易经定义的函数,可以简化代码

kotlin 复制代码
//函数引用
fun d(b: (Int) -> Int): Int {
    return b.invoke(1)
}

fun e(parma: Int): Int {
    return parma
}

val f = ::e
val h = d(::e)

注意:::对函数进行引用之后,实则是创建了一个对象,并不是函数本身,定义的函数无法调用invoke方法,而函数对象可以:

kotlin 复制代码
val m = f(1)// 等同于f.invoke(1)
val l = (::e)(1) //等同于(::e).invoke(1)

匿名函数

匿名函数(也称为lambda 函数)是一种没有名称的函数。它们通常用于作为函数参数传递给其他函数,或者简化某些操作。Kotlin 提供了两种主要的匿名函数写法:Lambda 表达式和匿名函数。

  • Lambda表达式是一种简洁的匿名函数写法,常用于高阶函数中。
kotlin 复制代码
val lambda = { parma: Int -> { parma * parma } }
  • 匿名函数和 Lambda 表达式非常相似,但它们有一些不同的地方,特别是在返回类型和参数类型推断方面。匿名函数可以显式地指定返回类型和参数类型,且它允许在函数体内使用 return 语句来返回结果。
kotlin 复制代码
val a = fun(parma: Int): String {
    return parma.toString()
}

注意:lambda不能使用return进行返回操作,而匿名函数可以

Kotlin Lambda

在Java中,我们设置函数式接口类型的对象通常使用匿名内部类或者lambda表达式:

java 复制代码
private OnClickListener mListener;

interface OnClickListener {
    void onClick(int value);
}

public  void setOnClickListener(OnClickListener listener) {
    this.mListener = listener;
}

//匿名内部类
setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(int value) {

    }
});
//lambda
setOnClickListener(value -> {

});

在Kotlin中lambda表达式变得更加简洁和方便

kotlin 复制代码
interface Listener {
    fun onClick(value: Int)
}

fun setListener(listener: Listener) {

}
//kotlin可以将setListener方法参数传对象改为高阶函数
fun setListener2(onClick: (Int) -> Unit) {

}

fun test() {
	//参数接收对象
    setListener(object : Listener {
        override fun onClick(value: Int) {
            println(value)
        }
    })
	//接收一个匿名函数
    setListener2(fun(value: Int): Unit {
        println(value)
    })
	//匿名函数可以替换为Lambda表达式
    setListener2({ value -> println(value) })
	//若接受的函数是参数列表的最后一个参数,可以写在括号外面
    setListener2(){ value -> println(value) }
	//若匿名函数只有一个参数可以省略,kotlin会用it代替它
    setListener2 { println(it) }
}

最终我们看到了Kotlin Lambda表达式较为简洁的写法。kotlin lambda表达式在声明时已经指定参数类型,因此参数类型可以不写,而返回值永远取最后一行代码的执行结果,因此也不需要指定返回值。Kotlin 匿名函数和Lambda的本质是函数类型的对象,和::是同样的效果,而Java 8中的Lambda只是一种简洁的写法。

相关推荐
张张张3125 分钟前
4.2学习总结 Java:list系列集合
java·学习
KATA~8 分钟前
解决MyBatis-Plus枚举映射错误:No enum constant问题
java·数据库·mybatis
xyliiiiiL24 分钟前
一文总结常见项目排查
java·服务器·数据库
shaoing25 分钟前
MySQL 错误 报错:Table ‘performance_schema.session_variables’ Doesn’t Exist
java·开发语言·数据库
腥臭腐朽的日子熠熠生辉1 小时前
解决maven失效问题(现象:maven中只有jdk的工具包,没有springboot的包)
java·spring boot·maven
ejinxian1 小时前
Spring AI Alibaba 快速开发生成式 Java AI 应用
java·人工智能·spring
杉之1 小时前
SpringBlade 数据库字段的自动填充
java·笔记·学习·spring·tomcat
圈圈编码2 小时前
Spring Task 定时任务
java·前端·spring
俏布斯2 小时前
算法日常记录
java·算法·leetcode
27669582922 小时前
美团民宿 mtgsig 小程序 mtgsig1.2 分析
java·python·小程序·美团·mtgsig·mtgsig1.2·美团民宿