kotlin函数类型
一 函数类型定义
1 定义
函数类型就是 (Int, Int) -> Int
函数类型其实就是将函数的 “参数类型” 和 “返回值类型” 抽象出来
2 示例 :
(Int, Int) -> Int 表示接收两个 Int 参数并返回 Int 的函数类型;
(String) -> Unit 表示接收 String 参数且无返回值的函数类型空 。
3 函数类型定义(补充)
-
基本形式:
(Int, Int) -> Int表示接收两个Int参数并返回Int的函数类型。(String) -> Unit表示接收String参数但无返回值的函数类型(Unit表示无返回值)。
-
特殊情况:
- 无参数的函数:
() -> String(无参数,返回String)。 - 返回值是函数的函数类型:
(Int) -> (Int) -> Int(接收Int,返回一个(Int) -> Int类型的函数)。 - 可空的函数类型:
((Int, Int) -> Int)?(函数类型可为null)。
- 无参数的函数:
-
函数类型的变量:
val sum: (Int, Int) -> Int = { a, b -> a + b } val printMessage: (String) -> Unit = { message -> println(message) }
二 Lambda 表达式
1 语法结构
{ 参数列表 -> 函数体 }
2 示例
示例:{ x: Int, y: Int -> x + y }
{a1:Int,b1:Int->a1+b1}
3 Lambda 表达式(补充)
-
省略参数类型(Kotlin 可以类型推导):
val sum = { a: Int, b: Int -> a + b } // 显式声明参数类型 val sum2: (Int, Int) -> Int = { a, b -> a + b } // 省略参数类型 -
单个参数时,使用
it(当 Lambda 只有一个参数时,it代表该参数):val square: (Int) -> Int = { it * it } // `it` 代表传入的参数 println(square(5)) // 输出 25 -
Lambda 作为参数传递:
fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {return op(a, b) }val result = operate(3, 4) { x, y -> x * y } println(result) // 输出 12 -
Lambda 作为函数返回值:
fun getOperator(): (Int, Int) -> Int {return { x, y -> x + y } }val add = getOperator() println(add(10, 5)) // 输出 15
三、高阶函数
高阶函数 指的是 接受函数类型作为参数或返回值的函数。
示例:
fun highOrderFunction(operation: (Int, Int) -> Int): Int {return operation(10, 20)
}val result = highOrderFunction { a, b -> a + b }
println(result) // 输出 30
总结
- 函数类型的特殊情况(无参数、返回值是函数、可空类型)。
- Lambda 表达式的简化写法(省略参数类型、
it关键字)。 - Lambda 作为参数和返回值。
- 高阶函数(函数可以接收 Lambda 作为参数)。
四 函数体
在 Kotlin 中,函数体(Function Body) 是定义函数具体行为的代码块,即 {} 大括号中的内容。它包含了函数要执行的逻辑和操作,具体分为两种形式:
1. 代码块函数体(Block Body)
当函数需要执行多行逻辑时使用,必须显式声明返回值(如果有返回值)。
// 完整函数体(包含 return)
fun add(a: Int, b: Int): Int {val sum = a + breturn sum
}// 无返回值的函数(Unit 可省略)
fun printMessage(message: String) {println("Message: $message")
}
2. 单表达式函数体(Single-Expression Body)
当函数可以通过单个表达式完成时,可省略 {} 并用 = 直接返回结果,编译器会自动推导返回值类型。
// 等价于代码块函数体,但更简洁
fun add(a: Int, b: Int) = a + b// 配合 when 表达式
fun getTypeName(type: Int) = when(type) {1 -> "A/C"2 -> "Heater"else -> "Unknown"
}
关键区别
| 特性 | 代码块函数体 | 单表达式函数体 |
|---|---|---|
| 语法 | 用 {} 包裹 | 用 = 连接表达式 |
| 返回值 | 必须显式 return | 自动返回表达式结果 |
| 类型推导 | 需显式声明返回值类型 | 可省略返回值类型声明 |
| 适用场景 | 多行逻辑、复杂操作 | 简单计算、条件判断 |
注意事项
• 类型推导限制:单表达式函数体仅在逻辑简单时可自动推导类型,复杂逻辑仍需显式声明。
• 作用域:代码块函数体中定义的变量(如示例中的 sum)仅在函数体内可见。
• 空函数体:无实际操作的函数可以留空 {},但需声明返回类型为 Unit(可省略)。
如果在 Android 开发中遇到函数体相关的具体问题(如事件回调的 lambda 简化写法等),可以进一步探讨!
五 省略参数列表情况
在 Kotlin 中,当 Lambda 表达式只有一个参数时,可以省略参数列表,直接使用 it 关键字来引用这个唯一的参数。
你的代码:
val square: (Int) -> Int = { it * it }
实际上等价于:
val square: (Int) -> Int = { x -> x * x }
这里 x 是 Lambda 的唯一参数。
为什么可以省略参数列表?
原因:
Kotlin 允许在 只有一个参数 的 Lambda 表达式中,使用 it 作为默认参数名称,省略显式声明。
规则:
-
如果 Lambda 只有一个参数,就可以用
it代替参数列表:val printMessage: (String) -> Unit = { println(it) } printMessage("Hello") // 输出 Hello相当于:
val printMessage: (String) -> Unit = { message -> println(message) } -
如果 Lambda 有多个参数,就必须显式声明参数列表:
val sum: (Int, Int) -> Int = { a, b -> a + b } // 必须写参数名不能写成
{ it + it },因为 Kotlin 无法知道it代表哪一个参数。
示例:省略参数 vs 显式参数
// 只有一个参数,使用 it
val double: (Int) -> Int = { it * 2 }
println(double(5)) // 输出 10// 两个参数,必须显式声明
val add: (Int, Int) -> Int = { a, b -> a + b }
println(add(3, 4)) // 输出 7
结论:
✅ it 适用于单参数 Lambda,当 Lambda 只有一个参数时,可以省略参数列表,直接用 it 代替。
❌ 多参数 Lambda 不适用 it,必须显式定义参数列表。
这样写代码更简洁,减少不必要的参数命名,让 Lambda 表达式更加直观!
相关文章:
kotlin函数类型
一 函数类型定义 1 定义 函数类型就是 (Int, Int) -> Int 函数类型其实就是将函数的 “参数类型” 和 “返回值类型” 抽象出来 2 示例 : (Int, Int) -> Int 表示接收两个 Int 参数并返回 Int 的函数类型; (String) -> Unit 表示接收 Strin…...
大数据Spark(五十七):Spark运行架构与MapReduce区别
文章目录 Spark运行架构与MapReduce区别 一、Spark运行架构 二、Spark与MapReduce区别 Spark运行架构与MapReduce区别 一、Spark运行架构 Master:Spark集群中资源管理主节点,负责管理Worker节点。Worker:Spark集群中资源管理的从节点,负责任务的运行…...
虚拟Ashx页面,在WEB.CONFIG中不添加handlers如何运行
https://localhost:44311/webapi.ashx 虚拟ASHX页面,在WEB.CONFIG中添加handlers,如何不添加节点,直接运行?把页面直接保存ASHX名称?现在是.VB 如果你不想通过在 web.config 里添加 handlers 节点来配置处理程序,而是直接让 .as…...
道路裂缝数据集CrackForest-156-labelme
来源于开源的数据集 https://github.com/cuilimeng/CrackForest-dataset 进行整理修改而成。 文章目录 1. 介绍2. 应用场景3. 相关工具4. 下载地址 1. 介绍 在现代城市管理中,道路状况的监测与维护是确保交通安全和城市基础设施健康的重要环节。 CrackForest是一个…...
HTML 表单:构建交互式网页的关键元素
HTML 表单:构建交互式网页的关键元素 引言 HTML表单是构建交互式网页的核心组件之一,它允许用户与网站进行交互,提交信息、填写问卷或进行其他操作。本文将深入探讨HTML表单的基础知识、常用元素、表单验证以及如何优化表单设计,以提高用户体验和网站的可访问性。 HTML表…...
Java进阶-day06:反射、注解与动态代理深度解析
目录 一、反射机制:Java的自我认知能力 1.1 认识反射 1.2 获取Class对象 1.3 获取类的成分 二、注解:Java的元数据机制 2.1 注解概述 2.2 元注解 2.3 注解解析 2.4 注解的实际应用 三、动态代理:灵活的间接访问机制 3.1 为什么需要…...
Redis数据结构之Hash
目录 1.概述2.常见操作2.1 H(M)SET/H(M)GET2.2 HGETALL2.3 HDEL2.4 HLEN2.5 HEXISTS2.6 HKEYS/HVALS2.7 HINCRBY2.8 HSETNX 3.总结 1.概述 Hash是一个String类型的field(字段)和value(值)的映射表,而且value是一个键值对集合,类似Map<String, Map<…...
故障矩阵像素照片效果ps标题文本特效滤镜样机 Glitched Arcade Text Logo Effect
有时,视觉效果比文字本身更能讲述故事,因此请确保您已竭尽全力提供令人敬畏的展示。品牌标识或演示元素,该资产可以处理您的项目所涉及的任何内容。由于智能对象图层,此文本效果将为获得理想的结果铺平道路。这些允许您在指定的图…...
[创业之路-352]:从创业和公司经营的角度看:分析美国的三大财务报表
一、美国政府的财务报表 如果把美国政府看成一个公司,从三大财务报表上看,美国政府资产雄厚,但利润表年年亏损,现金流量表年年为负,现金流持续吃紧,面临现金流断裂导致公司倒闭的风险。 马斯克在降低公司各…...
【学Rust写CAD】27 双线性插值函数(bilinear_interpolation.rs)
源码 use super::constant::BILINEAR_INTERPOLATION_BITS; // Inspired by Filter_32_opaque from Skia. fn bilinear_interpolation(tl: u32,tr: u32,bl: u32,br: u32,mut distx: u32,mut disty: u32, ) -> u32 {let distxy;let distxiy;let distixy;let distixiy;let mut…...
vs环境中编译osg以及osgQt
1、下载 OpenSceneGraph 获取源代码 您可以通过以下方式获取 OSG 源代码: 官网下载:https://github.com/openscenegraph/OpenSceneGraph/releases 使用 git 克隆: git clone https://github.com/openscenegraph/OpenSceneGraph.git 2、下载必要的第三方依赖库 依赖库 ht…...
【教学类-102-02】自制剪纸图案(留白边、沿线剪)02——Python+PS自动化添加虚线边框
背景需求: 01版本实现了对透明背景png图案边界线的扩展,黑线实线描边 【教学类-102-01】自制剪纸图案(留白边、沿线剪)01-CSDN博客文章浏览阅读974次,点赞15次,收藏7次。【教学类-102-01】自制剪纸图案(留白边、沿线剪)01https://blog.csdn.net/reasonsummer/article…...
基于 Netty 框架的 Java TCP 服务器端实现,用于启动一个 TCP 服务器来处理客户端的连接和数据传输
代码: package com.example.tpson_tcp;import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; imp…...
fbx bip互转 测试OK
目录 fbx bip互转 3dmax插件fbx转bip: 测试可以转: MotionBuilder fbx转bip fbx bip互转 3dmax插件fbx转bip: 测试可以转: 不用插件!!无脑把Mxiamo转bip骨骼动画 - CG软件插件脚本交流 - Powered by Discuz!...
iptables只允许指定网段的ip访问某端口配置
yum install -y iptables-services #安装 systemctl restart iptables.service #重启防火墙使配置生效 systemctl enable iptables.service #设置防火墙开机启动 systemctl disable iptables.service #禁止防火墙开机启动 iptables -F 清除所有链的规则。 关闭所有访问端口 …...
OFP--2018
文章目录 AbstractIntroductionRelated Work2D object detection3D object detection from LiDAR3D object detection from imagesIntegral images 3D Object Detection ArchitectureFeature extractionOrthographic feature transformFast average pooling with integral imag…...
libevent DNS开发
一、DNS功能 Libevent的DNS功能提供异步解析与服务器搭建能力,其核心设计分为阻塞式解析与事件驱动异步解析两套机制。 阻塞式解析(同步) 功能定位 通过evutil_getaddrinfo()提供可移植的阻塞式域名解析,兼容无标准getaddrinfo()接口的系统(如旧版…...
CentOS-查询实时报错日志-查询前1天业务报错gz压缩日志
最新版本更新 https://code.jiangjiesheng.cn/article/364?fromcsdn 推荐 《高并发 & 微服务 & 性能调优实战案例100讲 源码下载》 1. 查询实时报错日志 物理路径(带*的放在靠后,或者不用*) cd /home/logs/java-gz-log-dir &am…...
ETF 场内基金是什么?佣金最低又是多少呢?
嘿,朋友们,大家好啊,我是StockMasterX,今天咱们就坐下来慢慢聊聊这个话题,ETF 场内基金到底是个啥东西,它的佣金最低能到多少,真的是个值得深挖的问题。 说起ETF,我还记得刚入行那会…...
[论文阅读]PMC-LLaMA: Towards Building Open-source Language Models for Medicine
PMC-LLaMA:构建医学开源语言模型 摘要 最近,大语言模型在自然语言理解方面展现了非凡的能力。尽管在日常交流和问答场景下表现很好,但是由于缺乏特定领域的知识,这些模型在需要精确度的领域经常表现不佳,例如医学应用…...
26考研——线性表(2)
408答疑 文章目录 一、线性表的定义和基本操作二、线性表的顺序表示三、 线性表的链式表示四、 顺序表和链表的比较五、参考资料鲍鱼科技课件26王道考研书 六、总结顺序表总结顺序表特点深入掌握顺序表的管理方式 单链表总结双循环链表总结 一、线性表的定义和基本操作 文章链…...
写.NET可以指定运行SUB MAIN吗?调用任意一个里面的类时,如何先执行某段初始化代码?
VB.NET 写.NET可以指定运行SUB MAIN吗?调用任意一个里面的类时,如何先执行某段初始化代码? 分享 1. 在 VB.NET 中指定运行 Sub Main 在 VB.NET 里,你能够指定 Sub Main 作为程序的入口点。下面为你介绍两种实现方式: 方式一:在项目属性…...
低代码开发平台:飞帆画 echarts 柱状图
https://fvi.cn/711 柱状图这个控件是由折线图的控件改过来的,在配置中,单选框选择柱状图就行了。...
PowerPhotos:拯救你的Mac照片库,告别苹果原生应用的局限
如果你用Mac管理照片,大概率被苹果原生「照片」应用折磨过——无法真正并行操作多个图库。每次切换图库都要关闭重启,想合并照片得手动导出导入,重复文件更是无处可逃…… 直到我发现了 PowerPhotos,这款专为Mac设计的照片库管理…...
如何在Springboot的Mapper中轻松添加新的SQL语句呀?
在如今的软件开发界,Spring Boot可是非常受欢迎的框架哦,尤其是在微服务和RESTful API的构建上,真的是让人爱不释手!今天,我们就来聊聊如何为Spring Boot项目中的Mapper添加新的SQL语句吧!说起来࿰…...
Linux 下 日志系统搭建全攻略
目录 一、引言 二、日志系统基础 日志级别 日志输出格式 三、创建日志所需函数 认识可变参数 编辑 获取时间的函数 小结 四、创建日志 一、引言 在 Linux 环境中开发 C/C 程序时,日志系统是不可或缺的一部分。它不仅有助于调试程序、排查问题ÿ…...
Linux系统安装Postgre和Postgis教程
卸载 如果之前没装过可以忽略这一步 卸载前记得备份数据库数据(如果还需要的话)!!! 一、删除 Docker 安装的 PostgreSQL/PostGIS 1. 停止并删除容器 # 查看所有容器 docker ps -a | grep postgres# 停止并删除容器(替换为实际…...
LXC 导入多Linux系统
前提要求 ubuntu下安装lxd 参考Rockylinux下安装lxd 参考LXC 源替换参考LXC 容器端口发布参考LXC webui 管理<...
6547网:蓝桥STEMA考试 Scratch 试卷(2025年3月)
『STEMA考试是蓝桥青少教育理念的一部分,旨在培养学生的知识广度和独立思考能力。考试内容主要考察学生的未来STEM素养、计算思维能力和创意编程实践能力。』 一、选择题 第一题 运行下列哪个程序后,飞机会向左移动? ( ) A. …...
使用Webpack搭建React项目:从零开始
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...
