Kotlin Lambda

Kotlin Lambda

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

Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("Hello Java");}
};

等效为:

Runnable runnable = () -> System.out.println("Hello Java");

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

Kotlin高阶函数

在了解Kotlin Lambda之前,我们要先了解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中可以使用::对函数进行引用,并且还可以直接引用类似于集合中易经定义的函数,可以简化代码

//函数引用
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方法,而函数对象可以:

val m = f(1)// 等同于f.invoke(1)
val l = (::e)(1) //等同于(::e).invoke(1)

匿名函数

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

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

注意:lambda不能使用return进行返回操作,而匿名函数可以
在这里插入图片描述

Kotlin Lambda

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

private OnClickListener mListener;interface OnClickListener {void onClick(int value);
}public  void setOnClickListener(OnClickListener listener) {this.mListener = listener;
}//匿名内部类
setOnClickListener(new OnClickListener() {@Overridepublic void onClick(int value) {}
});
//lambda
setOnClickListener(value -> {});

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/16957.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Wpf美化按钮,输入框,下拉框,dataGrid

Wpf美化按钮&#xff0c;输入框&#xff0c;下拉框&#xff0c;dataGrid 引用代码后 引用资源 <ControlTemplate x:Key"CustomProgressBarTemplate" TargetType"ProgressBar"><Grid><Border x:Name"PART_Track" CornerRadius&q…

音视频协议

1. 多媒体信息 1.1 多媒体信息的两个主要特点&#xff1a; 信息量很大 标准语音&#xff1a;64Kbits(8KHz采样&#xff0c;8位编码)高质量音频&#xff1a;3Mbps(100KHz采样&#xff0c;12位编码) 在传输多媒体数据时&#xff0c;对时延和时延抖动均有较高要求 1.2 处理时延…

第一天:爬虫介绍

每天上午9点左右更新一到两篇文章到专栏《Python爬虫训练营》中&#xff0c;对于爬虫有兴趣的伙伴可以订阅专栏一起学习&#xff0c;完全免费。 键盘为桨&#xff0c;代码作帆。这趟为期30天左右的Python爬虫特训即将启航&#xff0c;每日解锁新海域&#xff1a;从Requests库的…

稀土抑烟剂——为汽车火灾安全增添防线

一、稀土抑烟剂的基本概念 稀土抑烟剂是一类基于稀土元素&#xff08;如稀土氧化物和稀土金属化合物&#xff09;开发的高效阻燃材料。它可以显著提高汽车内饰材料的阻燃性能&#xff0c;减少火灾发生时有毒气体和烟雾的产生。稀土抑烟剂不仅能提升火灾时的安全性&#xff0c;…

计算机网络-MPLS转发原理

在上一篇关于 MPLS 基础的文章中&#xff0c;我们了解了 MPLS 的基本概念、术语以及它在网络中的重要性。今天&#xff0c;我们将深入探讨 MPLS 转发的原理与流程&#xff0c;帮助大家更好地理解 MPLS 是如何在实际网络中工作的。 一、MPLS 转发概述 MPLS 转发的本质是将数据…

网络安全 | SNI介绍及F5中的配置应用

关注&#xff1a;CodingTechWork SNI介绍 SNI&#xff08;Server Name Indication&#xff09;是 TLS/SSL 协议中的一个重要扩展&#xff0c;旨在解决同一 IP 地址上托管多个网站时&#xff0c;如何选择正确的 SSL/TLS 证书进行加密通信的问题。SNI 通过在 TLS 握手初期传递客…

ARM Cortex-M3/M4 权威指南 笔记【二】架构

一、架构 1.1 架构简介 Cortex-M3/M4 处理器都基于 ARMv7-M 架构。最初的 ARMv7-M 架构是随着 Cortex-M3 处理器一同引入的&#xff0c;而在 Cortex-M4 发布时&#xff0c;架构中又额外增加了新的指令和特性&#xff0c;改进后的架构有时也被称为 ARMV7E-M。要了解 ARM7-M 和…

LabVIEW软件需求开发文档参考

在项目开发的工作历程中&#xff0c;精准把握项目需求无疑是成功打造整个项目的首要关键步骤&#xff0c;同时也是一个至关重要且不可忽视的核心环节。明确且详尽的项目需求就如同建筑的基石&#xff0c;为后续的设计、开发、测试等一系列工作提供了坚实的支撑和清晰的指引。倘…

Linux内核实时机制x - 中断响应测试 Cyclictest分析1

Linux内核实时机制x - 中断响应测试Cyclitest 1 实时性测试工具 rt-test 1.1 源码下载 1.下载源码&#xff1a; ~/0-code/5.15$ git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git 正克隆到 rt-tests... remote: Enumerating objects: 5534, done. remot…

Unity 代码优化记录

文档 unity 代码优化分析&#xff1a;https://docs.unity3d.com/Manual/analysis.html Unity 修复性能问题&#xff1a;https://learn.unity.com/tutorial/fixing-performance-problems-2019-3?courseId5c87de35edbc2a091bdae346#604586d7edbc2a5b4345d249 实例 具体枚举转En…

Arcgis/GeoScene API for JavaScript 三维场景底图网格设为透明

项目场景&#xff1a; 有时候加载的地图服务白色区域会露底&#xff0c;导致在三维场景时&#xff0c;露出了三维网格&#xff0c;影响效果&#xff0c;自此&#xff0c;我们需要将三维场景的底图设为白色或透明。 问题描述 如图所示&#xff1a; 解决方案&#xff1a; 提示…

snort3.0-ubuntu18.04 64入侵检测安装与使用ailx10ailx10​​知乎知识会员

在日常生活中&#xff0c;很多人怀疑自己的手机、电脑被监控了&#xff0c;担心自己的隐私泄漏&#xff0c;实际上最佳的检测方式就是终端检测&#xff0c;也就是EDR&#xff0c;但是就是有那么多的人在网上大放厥词&#xff0c;说任何EDR杀毒软件都检测不到监控&#xff0c;毕…

AI语言模型的技术之争:DeepSeek与ChatGPT的架构与训练揭秘

云边有个稻草人-CSDN博客 目录 第一章&#xff1a;DeepSeek与ChatGPT的基础概述 1.1 DeepSeek简介 1.2 ChatGPT简介 第二章&#xff1a;模型架构对比 2.1 Transformer架构&#xff1a;核心相似性 2.2 模型规模与参数 第三章&#xff1a;训练方法与技术 3.1 预训练与微调…

AI赋能前端协作:效率提升与团队新动力

当前前端开发领域竞争激烈&#xff0c;项目交付周期紧迫&#xff0c;前端开发团队面临着诸多挑战。沟通成本高、代码规范不统一、开发效率低等问题&#xff0c;常常导致项目延期、质量下降&#xff0c;甚至团队士气低落。而AI代码生成器的出现&#xff0c;为解决这些问题带来了…

Django快速入门

1. 安装 在安装了python环境下&#xff0c;在命令行winr&#xff0c;录入 pip install django或者使用国内源下载 pip install -i https://pypi.douban.com/simple/ django安装完成后&#xff0c;在%python%/Scripts目录下会出现如下图的django-admin.exe的文件 以及django…

Windows可以永久暂停更新了

最终效果图&#xff1a; 第一步&#xff1a; winR组合键打开运行对话框&#xff0c;输入“regedit”&#xff0c;点击“确定”或回车&#xff1a; 第二步&#xff1a; 注册表定位到“\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings”&#xff0c;新建DWO…

在anaconda环境中构建flask项目的exe文件

一、创建并激活虚拟环境 conda create -n flask_env python3.9 # python版本根据项目需求安装 conda activate flask_env # 激活环境二、安装必要依赖 推荐使用conda&#xff0c;pip没尝试过&#xff0c;但是deepseek给出了命令 conda install flask …

C++ Primer 条件语句

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

微服务SpringCloud Alibaba组件nacos教程【详解naocs基础使用、服务中心配置、集群配置,附有案例+示例代码】

一.Nacos教程 文章目录 一.Nacos教程1.1 Nacos简介1.2 nacos基本使用直接下载打包服务源码方式启动 1.3 创建nacos客服端1.4 nacos集群配置1.5 nacos配置中心 1.1 Nacos简介 nacos是spring cloud alibaba生态中非常重要的一个组件&#xff0c;它有两个作用&#xff1a; 1:注册…

在 Navicat 17 中扩展 PostgreSQL 数据类型 - 范围类型

范围类型 PostgreSQL 是市场上最灵活的数据库之一&#xff0c;这已不是什么秘密。事实上&#xff0c;PostgreSQL 的可扩展性和丰富的功能集使 PostgreSQL 近期已超越 MySQL&#xff0c;成为最受开发人员推崇和最受欢迎的数据库系统。在这个使用 Navicat Premium 17 在 Postgre…