[Kotlin入门] 函数式编程与lambda表达式

Kotlin函数式编程与Lambda表达式 函数式编程的基本概念和优势高阶函数的使用方法Lambda表达式的语法和简化技巧作用域函数的应用场景实际项目中的最佳实践函数式编程和Lambda表达式是Kotlin的重要特性,掌握好这些特性可以帮助我们写出更简洁、更易维护的代码。在实际开发中,要根据具体场景选择合适的编程方式,既要利用好函数式编程的优势,也要避免过度使用导致代码难以理解。 阅读详情

1. 集合的函数式API

//找出水果集合里长度最长的单词
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
val maxLengthFruit = list.maxBy { it.length }
println("max length fruit is " + maxLengthFruit)

maxBy源代码:maxBy就是一个普通的函数而已,只不过它接收的是一个Lambda类型的参数,并且会
在遍历集合时将每次遍历的值作为参数传递给Lambda表达

public inline fun <T, R : Comparable<R>> Iterable<T>.maxBy(selector: (T) -> R): T? {
    return maxByOrNull(selector)
}

lambda完整表达式,但在实际中往往可以进行简化

{参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}
//数列表的结尾使用一个->符号,表示参数列表的结束以及函数体的开始,
//函数体中可以编写任意行代码(虽然不建议编写太长的代码),并且最后一行代码会自动作为Lambda表达式的返回值

接下来将一步步推导上面的代码如何简化而来的:

val lambda = { fruit: String -> fruit.length }
val maxLengthFruit = list.maxBy(lambda)

直接把参数写在里面

val maxLengthFruit = list.maxBy({ fruit: String -> fruit.length })

当Lambda参数是函数的最后一个参数时,可以将Lambda表达式移到函数括号的外面

val maxLengthFruit = list.maxBy() { fruit: String -> fruit.length }

如果Lambda参数是函数的唯一一个参数的话,还可以将函数的括号省略

val maxLengthFruit = list.maxBy { fruit: String -> fruit.length }

由于Kotlin拥有出色的类型推导机制,Lambda表达式中的参数列表其实在大多数情况下不必声明参数类型

val maxLengthFruit = list.maxBy { fruit -> fruit.length }

当Lambda表达式的参数列表中只有一个参数时,也不必声明参数名,而是可以使用it关键字来代替

val maxLengthFruit = list.maxBy { it.length }

2. Java函数式API

注意:Java函数式API的使用都限定于从Kotlin中调用Java方法,并且单抽象方法接口也必须是用Java语言定义的
如果我们在Kotlin代码中调用了一个Java方法,并且该方法接收一个Java单抽象方法接口参数,就可以使用函数式API。Java单抽象方法接口指的是接口中只有一个待实现方法,如果接口中有多个待实现方法,则无法使用函数式API。
下面进行举例子说明:
Thread类的构造方法中接收了一个Runnable参数

public interface Runnable {
 void run();
}

使用java写法:

Thread(object : Runnable {
 override fun run() {
 println("Thread is running")
 }
}).start()

使用kotlin写法:

Thread(object : Runnable {
 override fun run() {
 println("Thread is running")
 }
}).start()
//kotlin使用object创建匿名类

下面进行简化:

  1. 因为Runnable类中只有一个待实现方法,即使这里没有显式地重写run()方法,Kotlin也能自动明白Runnable后面的Lambda表达式就是要在run()方法中实现的内容
Thread(Runnable {
 println("Thread is running")
}).start()
  1. 如果一个Java方法的参数列表中有且仅有一个Java单抽象方法接口参数,我们还可以将接口名进行省略
Thread({
 println("Thread is running")
}).start()
  1. 当Lambda表达式是方法的最后一个参数时,可以将Lambda表达式移到方法括号的外面;如果Lambda表达式还是
    方法的唯一一个参数,还可以将方法的括号省略 (如第一节介绍)
Thread{
 println("Thread is running")
}.start()

3. 常见集合的API

初始化集合

//list不可变集合
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
//可变集合
val list = mutableListOf("Apple", "Banana", "Orange", "Pear", "Grape")
list.add("Watermelon")
//同理有set
val set = setOf("Apple", "Banana", "Orange", "Pear", "Grape")
mutableSetOf()
//map
val map = HashMap<String, Int>()
map["Apple"] = 1 //添加数据 不建议put
val number = map["Apple"] //取数据
//更简便的map写法
val map = mapOf("Apple" to 1, "Banana" to 2, "Orange" to 3, "Pear" to 4, "Grape" to 5)
//to为一个infix函数

常用api

//找最大maxby
val maxLengthFruit = list.maxBy { it.length }
// 映射map
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
val newList = list.map { it.toUpperCase() }
//过滤filter
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
val newList = list.filter { it.length <= 5 }
 .map { it.toUpperCase() }
 //中any函数用于判断集合中是否至少存在一个元素满足指定条件
// all函数用于判断集合中是否所有元素都满足指定条件
 val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
 val anyResult = list.any { it.length <= 5 }
 val allResult = list.all { it.length <= 5 }

新版本大疆智图4.5 永久许可摄影测量建模软件 大疆智图支持常见格式的成果输出,包括 TIFF 正射影像和高程模型、LAS 格式点云,以及 B3DM、OSGB、OBJ 等六种常用格式的三维模型,还包括 DXF 和 SHP 等格式的等高线。大疆智图 DJI Terra是领先的三维重建软件,提供先进的技术和简单的操作,一站式解决方案,从航线规划到数据的获取,以及模型重建、数据分析等都提供独一无二的支持,优化项目工程,提供自动化优势,获得更有效智能的决策和行动,最终用户可以获得理想的结果,减轻工作压力,提高作业效率。质量报告和剖面查看功能有助于分析点云质量。 阅读详情

相关推荐

uniapp+openlayers集成天地图实战:renderjs通信陷阱与性能优化避坑指南

本文深入探讨了uniapp与openlayers集成天地图时的renderjs通信陷阱与性能优化策略。通过实战案例解析了renderjs的特殊通信机制、地图实例生命周期管理、图层懒加载等关键技巧,帮助开发者避免常见坑点,提升应用流畅度。特别针对多语言切换、热重载偏移等疑难问题提供了解决方案,是uniapp+openlayers开发者的实用避坑指南。

weixin_30872157的博客 362

Android第一行代码——快速入门 Kotlin 编程(2.6 Lambda 编程)

函数的功能非常强大,它可以按照我们的需求对集合中的元素进行任意的映射转换,上面只是一个简单的示例而已。这样我们就将 Lambda 表达式的语法结构和几个常用的函数式 API 的用法都学习完了,虽然集合中还有许多其他函数式 API,但是只要掌握了基本的语法规则,其他函数式 API 的用法只要看一 看文档就能掌握了,相信这对你来说并不是难事。函数是最常用的一种函数式 API,它用于将集合中的每个元素都映射成一个另外的值,映射的规则在 Lambda 表达式中指定,最终生成一个新的集合。

fhbxts的博客 1166

历史预测+LLM双杀!DriveGPT4-V2闭环驾驶配置避坑指南

本文深入探讨了DriveGPT4-V2在工程化部署中的核心挑战与解决方案。通过融合历史轨迹预测与大语言模型,该模型旨在实现更可靠的端到端自动驾驶。文章详细解析了从环境配置、多模态Token对齐、轻量控制头设计到训练优化与闭环仿真验证的全流程,为开发者提供了一份详实的避坑指南。

transformer2023的博客 384

Kotlin从小白到大牛第3篇 【Kotlin】函数式编程视频课程-关东升-专题视频课程

本视频是智捷课堂推出的一套“Kotlin语言学习立体教程”的视频第三部分,主要内容包括:高阶函数、Lambda表达式、数组、集合、函数式编程API等

「智捷课堂」关东升的博客 414

Ubuntu20.04系统Cuckoo sandbox所需环境搭建及安装(超详细图文)

请勿叫我大神,我只是互联网的搬运工~ 前言 本教程以Ubuntu20桌面版作为示范,服务器版同样适用,但可能稍微麻烦一点,服务器版本的话安装Xmanage套装使用可能会相对轻松一些,由于后面会使用到vbox的使用,对vbox命令行操作不熟悉的小伙伴用xmanage可能会相对轻松一点。 提示:以下是本篇文章正文内容,下面案例可供参考 安装ubuntu20桌面版 步骤1:转到https://ubuntu.com/download/desktop下载下载.iso。 步骤2:使用您选择的虚拟机监控程序(VMWa

ElsonHY的博客 1万+

杰理JL7033C芯片运行SoundFont音色库教程

本教程介绍如何在杰理JL7033C芯片上移植TinySoundFont音色库,实现MIDI播放功能。关键步骤包括:获取TinySoundFont开源代码,创建音色库声音播放数据流,封装核心功能文件。硬件需配备外部PSRAM和NOR FLASH存储音色库,软件使用杰理SDK和工具链。移植后系统可支持40个voice,满足MIDI播放和电子琴演奏需求。教程详细说明了代码移植过程,包括音色库文件处理、内存配置和音频流水线设置。

qq_42014563的博客 610

Kotlin入门理解- 函数演变、lambada表达式、高级函数

Kotlin入门理解 函数演变 fun methon(a:String,b:String):String{ return a+b } fun methon1(a:String,b:String):String = a+b //编译时推断返回类型 fun methon2(a:String,b: String) = a+b 个人理解:在kotlin中,方法皆是函数,可以当作参数传递。不同的形式只是为了简化代码 lambada表达式 //如果只有一个形参,用it默认表示。 val lamdab

feipengwang的博客 247

【四足机器人项目实战】四足机器人嵌入式硬件设计

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、电源管理板设计及制作二、通讯中继板设计及制作三、力控无刷电机驱动板设计及制作1.磁场定向控制FOC控制原理2.电机转子位置、速度检测原理3.硬件CAN通讯原理 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对四足机器人–嵌入式硬件设计做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章 提示:以下是本篇文章正文内容 一、电

qq_35635374的博客 1万+

【教程】Kotlin语言学习笔记(五)——Lambda表达式与条件控制

Kotlin语言学习第五部分

EliasChang的博客 1003

【TRAE调教指南之MCP篇】Context 7 MCP:让AI永远拥有最新技术文档

【TRAE调教指南之MCP篇】Context 7 MCP:让AI永远拥有最新技术文档

funfan的博客 1314

fatal: unable to access ‘https://github.com/Stability-AI/stablediffusion.git/‘解决方案

本文主要介绍在安装 stable-diffusion-webui 时出现的 fatal: unable to access 'https://github.com/Stability-AI/stablediffusion.git/': Failed to connect to github.com port 443 after 21071 ms: Couldn't connect to server 问题的解决方案,希望能对你有所帮助。

水滴的博客 5685

Kotlin中的lambda函数式API编程

函数接收两个参数,第一个参数是任意类型的对象,第二个参数是lambda表达式,在lambda表达式中会提供第一个参数的上下文,并用最后一行作为返回值。当我们用Kotlin调用Java方法时,如果这个方法只接受一个Java单抽象方法接口参数就可以换成函数式API。函数非常常用,可以把集合的每个元素都映射成另一个值,规则则是由接受的lambda表达式决定。这个函数,该函数工作原理是接收一个lambda表达式,根据传入的条件来找到最大值。的优秀推导类型的机制,可以直接省略类型,然后当参数只有一个时,可以直接用。

zzx_0826的博客 1512

SAP会计凭证导入ABAP开发模板+注意点—附带源码

开发并不仅仅只要考虑实现的功能,只实现功能的是程序,考虑到使用场景的是工程。使用bapi校验创建会计凭证的数据,报错和参数和正式创建一致。用途,防止产生错误的凭证,即使财务凭证可以冲销。正式创建会计凭证。隐藏的坑。

小九啥也不会 1232

函数式编程和Lambda表达式 | KMP鸿蒙Kotlin指南

本文档介绍了Kotlin Multiplatform(KMP)在鸿蒙跨端开发中的函数式编程应用。主要内容包括Lambda表达式基础、高阶函数、函数类型等核心概念,展示了如何通过函数式编程实现代码简洁、并发安全和跨端兼容。文档提供了丰富的代码示例,如Lambda表达式定义、高阶函数参数传递、函数组合等实用技巧,并强调函数式编程在代码复用和测试方面的优势。特别针对KMP跨平台特性,说明函数式代码如何高效编译到JavaScript并在OpenHarmony运行,为开发者提供了函数式编程在跨端开发中的实践指导。

Rffhu的博客 980

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

用 Kotlin 实现函数式编程:高阶函数与 Lambda 表达式

函数式编程是一种编程范式,它将计算视为数学函数的求值过程,强调不可变数据和纯函数的使用。与命令式编程不同,函数式编程更注重数据的变换,而非对状态的改变。在函数式编程中,函数是一等公民,这意味着函数可以像其他数据类型一样,作为参数传递给其他函数,也可以作为函数的返回值。这种特性为编程带来了更高的抽象层次,让代码更加简洁、可复用,同时也增强了代码的可测试性与可维护性。高阶函数是指接受一个或多个函数作为参数,或者返回值为函数的函数。在 Kotlin 中,实现高阶函数极为便捷。

数字魔方操控师的博客 802

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【深度动画图文详解:函数式编程思想】 Kotlin 函数式编程: 一切皆是映射

一切皆是映射。 陈光剑 Kotlin中函数式一等公民,地位和对象一样高,你可以在方法中输入函数,也可以返回函数。相对于Scala的学院派风格,Kotlin则是纯的的工程派:实用性、简洁性上都要比Scala要好。 01 — Kotlin 简介 Kotlin是一门新兴的JVM 语言,与Scala等充满野心,想要取代Jav...

AI天才研究院 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Kotlin 面向对象与函数式编程

Kotlin 是一门现代化的编程语言,它充分融合了面向对象(OOP)和函数式编程(FP)的理念,提供了简洁且强大的功能。通过理解 Kotlin 的面向对象和函数式编程特性,开发者可以写出更简洁、优雅、易于维护的代码。在本篇文章中,我们将深入探讨 Kotlin 中的面向对象特性和函数式编程特性,并通过一个实战任务管理应用的开发,演示如何将这些特性应用于实际开发中。Kotlin 的类和构造函数非常简洁,支持主构造函数和次构造函数。主构造函数声明在类头部,次构造函数使用关键字定义。nameage。

秋元的博客 1137

Kotlin 中 Lambda的使用 一、入门 集合的函数式API中Lambda表达式的使用

很多高级编程语言很早就支持Lambda编程,java从JDK1.8开始支持Lambda编程语法,而kotlin从第一版开始就支持Lambda编程。本章从集合的函数式API的使用做的Kotlin中Lambda入门。

old_land的博客 1317

kotlin之函数式接口(lambda 表达式)

kotlin之函数式接口(lambda 表达式) 对于新学者来说lambda 表达式一直是一个比较有阅读阻碍的功能,所以新手慎用 首先可以使用函数式接口的要求 只能有一个抽象方法 函数式接口可以有多个非抽象成员,但是只能有一个抽象成员 可以用 fun 修饰符在 Kotlin 中声明一个函数式接口。 fun interface KRunnable { fun invoke() } SAM 转换 对于函数式接口,可以通过 lambda 表达式实现 SAM 转换,从而使代码更简洁、更有可读性。 使用

一清的博客 2273

【Kotlin函数式编程进阶之路】:从Lambda基础到流式操作全解析

掌握Kotlin lambda 表达式,提升函数式编程效率。本文详解其在集合操作、异步处理与流式API中的应用,涵盖高阶函数、闭包与简化语法等核心技巧,助你写出更简洁高效的Kotlin代码,值得收藏。

CodeNexus的博客 957

Kotlin与函数式编程

Kotlin 简介 由俄罗斯圣彼得堡的JetBrains团队开发的新编程语言,其名称来自于圣彼得堡以西约30公里处的科特林岛。 Kotlin是一种运行在Java虚拟机上的静态类型编程语言。它可以被编译成Java字节码、JavaScript代码、本地机器码。支持与Java,Android 100% 完全互操作。 发展历史 2011年7月,JetBrains推出Kotlin项目 2012...

millerkevin 1280

Kotlin中的Lambda表达式

函数式编程是一种如何编写程序的**方法论**,它将电脑运算视为函数的运算,其主要思想是把运算过程尽量写成一系列的函数嵌套调用。

尼古拉斯的AI笔记 799

Kotlin学习6.1:Lambda表达式入门

Kotlin学习6.1:Lambda表达式入门Lambda表达式简介无参数有返回值有参数有返回值Lambda表达式返回值 Lambda表达式简介 Lambda表达式就是一个匿名函数,它是函数式编程的基础,所谓函数式编程实际上就是一种编程范式,即如何编写程序的方法论。 函数式编程的思想是将计算机运算视为函数的计算,并且计算的代码可以接收函数作为输入参数或者当做返回值来使用。 使用函数式编程可以减少代...

qq_43233085的博客 896

【Kotlin学习】Lambda编程——Lambda表达式和成员引用、集合的函数式API

学习于《Kotlin实战》,本文讲解了Lambda编程的基本用法,讲述了Lambda表达式和成员引用和一部分的集合函数式API

PanicLin的博客 1805

《Kotlin从小白到大牛》第14章:函数式编程基石——高阶函数和Lambda表达式

第14章 函数式编程基石——高阶函数和Lambda表达式 函数式编程思想虽然与面向对象一样立即悠久,但是支持函数式编程的计算机语言不过是近几年的事情。这些语言有Swift、Python、Java 8和C++11等,作为新生的语言Kotlin也支持函数式编程。本章将介绍Kotlin语言中函数式编程最重要的基础知识——高阶函数和Lambda表达式。 14.1 函数式编程简介 函数式编程(functional programming)与面向对象编程一样都一种编程范式,函数式编程,也称为面向函数的编程。在函数式编程

weixin_38072116的博客 715

给Agent写测试-工具调用的回归怎么保

本文提出“测行为不测文字”的三层测试防线,解决 Agent 工具调用回归难题:第一层工具单测(纯函数);第二层循环集成测,通过 mock 模型断言工具调用、参数与回填的正确性;第三层评测集,固定问答对对比行为快照。代码演示了最小可运行测试,强调断言行为而非模型输出,确保提示词改动可安全合并。

D_ENG_F的博客 205
上一篇: [Kotlin技巧] 泛型简化回调
下一篇: 【Android生成APK】 APP生成正式签名的APK
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值