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只是一种简洁的写法。

相关推荐
rannn_11111 分钟前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
qq_124987075315 分钟前
基于JavaWeb的大学生房屋租赁系统(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·计算机视觉·毕业设计·计算机毕业设计
短剑重铸之日21 分钟前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
若鱼191943 分钟前
SpringBoot4.0新特性-Observability让生产环境更易于观测
java·spring
觉醒大王1 小时前
强女思维:着急,是贪欲外显的相。
java·论文阅读·笔记·深度学习·学习·自然语言处理·学习方法
努力学编程呀(๑•ี_เ•ี๑)1 小时前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea
码农小卡拉1 小时前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
向上的车轮1 小时前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
Dragon Wu1 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
跳动的梦想家h1 小时前
环境配置 + AI 提效双管齐下
java·vue.js·spring