Kotlin Lambda表达式与标准库中的高阶函数
在Kotlin中,Lambda表达式和标准库中的高阶函数为我们提供了一种简洁而强大的方式来处理集合和执行各种操作。本篇博客将介绍Lambda表达式的基本概念,并结合标准库中的高阶函数示例,展示它们的用法和功能。
Lambda表达式的基本概念
Lambda表达式是一种匿名函数,它可以作为值传递、存储和执行。它的基本语法如下:
val lambdaName = { parameters -> lambdaBody }
lambdaName是一个变量,用于存储Lambda表达式。parameters是Lambda表达式的参数列表。lambdaBody是Lambda表达式的函数体,包含了执行的代码逻辑。
Lambda表达式的返回值类型和返回值由函数体中最后一条语句决定。
标准库中的高阶函数
Kotlin标准库提供了许多高阶函数,它们可以直接应用于集合操作和其他常见的功能。以下是一些常用的高阶函数示例:
find
find函数用于在集合中查找满足给定条件的第一个元素。如果找到了符合条件的元素,则返回该元素;否则返回null。
val list = listOf(-2, -1, 0, 1, 2)
println("找出大于0的元素:${list.find { it > 0 }}") // 找出大于0的元素:1
println("找出大于3的元素:${list.find { it > 3 }}") // 找出大于3的元素:null
first和last
first和last函数用于在集合中查找满足给定条件的第一个或最后一个元素。如果找到了符合条件的元素,则返回该元素;否则会抛出NoSuchElementException异常。
val list = listOf(-2, -1, 0, 1, 2)
println("找出first大于0的元素:${list.first { it > 0 }}") // 找出first大于0的元素:1
println("找出last大于0的元素:${list.last { it > 0 }}") // 找出last大于0的元素:2
single
single函数用于在集合中查找满足给定条件的唯一一个元素。如果找到了符合条件的元素,则返回该元素;如果找到多个符合条件的元素,则会抛出IllegalArgumentException异常;如果没有找到符合条件的元素,则会抛出NoSuchElementException异常。
val list = listOf(-2, -1, 0, 1, 2)
println("找出single大于0的元素:${list.single { it > 1 }}") // 找出single大于0的元素:2
takeWhile
takeWhile函数用于从集合中获取满足给定条件的连续元素。当遇到第一个不满足条件的元素时,停止查找并返回结果。
val list = listOf(-2, -1, 0, 1, 2)
println("找takeWhile大于-3的元素:${list.takeWhile { it > -3 }}") // 找takeWhile大于0的元素:[-2, -1, 0, 1, 2]
filter
filter函数用于过滤集合中满足给定条件的元素,并返回一个新的集合。
val list = listOf(-2, -1, 0, 1, 2)
println("找filter大于0的元素:${list.filter { it > 0 }}") // 找filter大于0的元素:[1, 2]
count
count函数用于计算集合中满足给定条件的元素个数。
val list = listOf(-2, -1, 0, 1, 2)
println("找count大于0的元素的个数:${list.count { it > 0 }}") // 找count大于0的元素的个数:2
maxBy和minBy
maxBy和minBy函数用于找出集合中的最大值和最小值。它们接受一个函数作为参数,用于确定比较的依据。
val list = listOf(-2, -1, 0, 1, 2)
println("找集合最大值:${list.maxBy { it }}") // 找集合最大值:2
println("找集合最小值:${list.minBy { it }}") // 找集合最小值:-2
其他常用高阶函数
除了上述示例中介绍的高阶函数外,Kotlin标准库还提供了许多其他常用的高阶函数,例如map、flatMap、reduce、groupBy等。这些高阶函数可以帮助我们更便捷地处理集合和执行各种操作。
repeat函数
repeat函数用于重复执行某条语句或代码块。它接受一个整数参数和一个Lambda表达式作为参数,指定重复的次数和要执行的代码逻辑。
repeat(2) {println("repeat*2")
}
上述示例中,代码块println("repeat*2")将被执行两次,结果会打印出两行"repeat*2"。
T.run函数
run函数是一个扩展函数,可用于某个对象(例如集合、类实例等)上执行一系列操作。它可以省略对象名字来调用对象的方法,使代码更加简洁。
var list2 = ArrayList<String>()
list2.run {add("A")add("B")add("C")
}
println(list2) // [A, B, C]
上述示例中,我们通过run函数在list2对象上执行了一系列的add操作,而无需重复使用list2来调用方法。
总结:
Lambda表达式和标准库中的高阶函数为Kotlin开发者提供了很好的工具来处理集合和执行各种操作。通过灵活运用Lambda表达式和高阶函数,我们可以编写出简洁、高效的代码,提高开发效率。在实际开发中,可以根据不同的场景选择合适的高阶函数,以便达到更好的代码可读性和维护性。
相关文章:
Kotlin Lambda表达式与标准库中的高阶函数
在Kotlin中,Lambda表达式和标准库中的高阶函数为我们提供了一种简洁而强大的方式来处理集合和执行各种操作。本篇博客将介绍Lambda表达式的基本概念,并结合标准库中的高阶函数示例,展示它们的用法和功能。 Lambda表达式的基本概念 Lambda表…...
【JavaEE初阶】 CAS详解
文章目录 🌲什么是 CAS🚩CAS伪代码 🎋CAS 是怎么实现的🌳CAS的应用🚩实现原子类🚩实现自旋锁 🎄CAS 的 ABA 问题🚩什么是 ABA 问题🚩ABA 问题引来的 BUG🚩解决…...
Docker镜像制作
目录 Dockfile是什么 构建镜像的三个步骤 dockerfile内容基础知识 docker执行一个Dockerfile脚本的大致流程 Dockerfile指令 FROM MAINTAINER RUN EXPOSE WORKDIR ENV ADD COPY VOLUME USER ONBUILD CMD ENTRYPOINT CMD和ENTRYPOINT区别 构建dockerfile Do…...
v-on 可以监听多个方法吗?
目录 编辑 前言:Vue 3 中的 v-on 指令 详解:v-on 指令的基本概念 用法:v-on 指令监听多个方法 解析:v-on 指令的优势和局限性 优势 局限性 **v-on 指令的最佳实践** - **适度监听**: - **方法抽离**&#x…...
【Docker】Docker Compose的使用
我们知道使用一个Dockerfile模板文件,可以让用户很方便的定义⼀个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。 例如要实现一个Web项目,除了Web服务容器本身,往往还需要…...
2023年中国调速器产量、销量及市场规模分析[图]
调速器行业是指生产、销售和维修各种调速器设备的行业。调速器是一种能够改变机械传动系统输出转速的装置,通过调整输入和输出的转速比来实现转速调节的功能。 调速器行业分类 资料来源:共研产业咨询(共研网) 随着工业自动化程度…...
深入了解JVM调优:解锁Java应用程序性能的秘诀
文章目录 🍊 JVM调优🎉 增大Eden 空间大小🎉 如果MinorGC 频繁,且容易引发 Full GC📝 S1 区大小 < MGC 存活的对象大小,对象的年龄才1岁📝 相同年龄的对象所占总空间大小>s1区空间大小的一…...
[java进阶]——线程池的使用,自定义线程池
🌈键盘敲烂,年薪30万🌈 目录 一、线程池的存在意义 二、线程池的使用 2.1线程池的核心原理 2.2线程池的代码实现 三、自定义线程池 3.1线程池的参数详解 3.2线程池的执行原理 3.3灵魂两问 3.4线程池多大合适 3.5拒绝策略 一、线程池…...
Linux 进程切换与命令行参数
假设进程1现在要切走了,切入进程2.那进程1就要先保存数据,方便以后恢复, 然后进程2再切走,进程1再把数据还原: 操作系统又分为实时操作系统和分时操作系统。 实时操作系统是是给操作系统一个进程,操作系统…...
Python基础入门例程6-NP6 牛牛的小数输出
目录 描述 输入描述: 输出描述: 示例1 解答: 说明: 描述 牛牛正在学习Python的输出,他想要使用print函数控制小数的位数,你能帮助它把所有读入的数据都保留两位小数输出吗? 输入描述&a…...
传奇游戏常见问题解决办法
GEE合区出现错误常规解决方案 GEE合区出现错误大部分因数据库损坏导致的合区报错,如果合区提示内存不足,更新64位合区,使用64位合区工具在服务器上进行合并,合区需要将2个区数据大部分提取到内存中,32位合区工具支持内…...
2310D的dll问题
原文 我正在开发一个游戏引擎,偶然发现了一些空针问题. 考虑此简单程序: class Test {void doIt(){} } void main() {Test t;t.doIt(); }它编译,然后在Linux上使用DMD时,用11信号干掉了. 如果使用Java,甚至不会构建该程序,因为它会失败,说明从未初化它. 但我不关心分析器,我宁…...
包管理工具
代码共享方案 放到npm仓库,下载到本地放到node_modules npm配置文件 必须填写的属性:name、version name是项目的名称; version是当前项目的版本号; description是描述信息,很多时候是作为项目的基本描述;…...
Qt第六十五章:自定义菜单栏的隐藏、弹出
目录 一、效果图 二、qtDesigner 三、ui文件如下: 四、代码 一、效果图 二、qtDesigner 原理是利用属性动画来控制QFrame的minimumWidth属性。 ①先拖出相应的控件 ②布局一下 ③填上一些样式 相关QSS background-color: rgb(238, 242, 255); border:2px sol…...
element table中嵌套el-select 无法选择问题
<el-table-column align"left" label"姓名" show-overflow-tooltip :key"tableKey"><template slot-scope"scope"><el-select placeholder"请选择" :disabled"!saveButton" v-model"scope.ro…...
2.6.C++项目:网络版五子棋对战之数据管理模块-游戏房间管理模块的设计
文章目录 一、意义二、功能三、作用四、游戏房间类基本框架五、游戏房间管理类基本框架七、游戏房间类代码八、游戏房间管理类代码 一、意义 对匹配成功的玩家创建房间,建立起一个小范围的玩家之间的关联关系! 房间里一个玩家产生的动作将会广播给房间里…...
计算机视觉中的数据预处理与模型训练技巧总结
计算机视觉主要问题有图像分类、目标检测和图像分割等。针对图像分类任务,提升准确率的方法路线有两条,一个是模型的修改,另一个是各种数据处理和训练的技巧(tricks)。图像分类中的各种技巧对于目标检测、图像分割等任务也有很好的作用&#…...
GeoHash分享
写在前边 复制的一个内部分享,所以可能更偏向PPT性质,本文提出的问题,在末尾参考材料中都会有所提及,包括更深层次的实现原理和各大API对于GeoHash的优化。感兴趣的读者可以拓展看一下。 START GeoHash是一种地址编码ÿ…...
【超详细】CentOS 7安装MySQL 5.7【安装及密码配置、字符集配置、远程连接配置】
准备工作:CentOS 7系统,并确保可以联通网络 1、获取MySQL 5.7 Community Repository软件包 注意:这里使用的是root用户身份。 wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm2、安装软件包 rpm -ivh mysql5…...
Elasticsearch 8.X 分词插件版本更新不及时解决方案
1、关于 Elasticsearch 8.X IK 分词插件相关问题 球友在 ElasticSearch 版本选型问题中提及:如果要使用ik插件,是不是就使用目前最新的IK对应elasticsearch的版本“8.8.2”? https://github.com/medcl/elasticsearch-analysis-ik/releases/ta…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
