kotlin函数类型

一 函数类型定义

1 定义

函数类型就是 (Int, Int) -> Int
函数类型其实就是将函数的 “参数类型” 和 “返回值类型” 抽象出来

2 示例 :

(Int, Int) -> Int 表示接收两个 Int 参数并返回 Int 的函数类型;
(String) -> Unit 表示接收 String 参数且无返回值的函数类型空 。

3 函数类型定义(补充)

  1. 基本形式

    • (Int, Int) -> Int 表示接收两个 Int 参数并返回 Int 的函数类型。
    • (String) -> Unit 表示接收 String 参数但无返回值的函数类型(Unit 表示无返回值)。
  2. 特殊情况

    • 无参数的函数() -> String(无参数,返回 String)。
    • 返回值是函数的函数类型(Int) -> (Int) -> Int(接收 Int,返回一个 (Int) -> Int 类型的函数)。
    • 可空的函数类型((Int, Int) -> Int)?(函数类型可为 null)。
  3. 函数类型的变量

    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 表达式(补充)

  1. 省略参数类型(Kotlin 可以类型推导)

    val sum = { a: Int, b: Int -> a + b } // 显式声明参数类型
    val sum2: (Int, Int) -> Int = { a, b -> a + b } // 省略参数类型
    
  2. 单个参数时,使用 it(当 Lambda 只有一个参数时,it 代表该参数):

    val square: (Int) -> Int = { it * it }  // `it` 代表传入的参数
    println(square(5)) // 输出 25
    
  3. 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
    
  4. 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

总结

  1. 函数类型的特殊情况(无参数、返回值是函数、可空类型)。
  2. Lambda 表达式的简化写法(省略参数类型、it 关键字)。
  3. Lambda 作为参数和返回值
  4. 高阶函数(函数可以接收 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 作为默认参数名称,省略显式声明。

规则:

  1. 如果 Lambda 只有一个参数,就可以用 it 代替参数列表:

    val printMessage: (String) -> Unit = { println(it) }
    printMessage("Hello")  // 输出 Hello
    

    相当于:

    val printMessage: (String) -> Unit = { message -> println(message) }
    
  2. 如果 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 表达式更加直观!

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

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

相关文章

C# Winform 入门(9)之如何封装并调用dll

封装dll 首先创建 .Net平台 类库 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _09.Encapsulation_dll {public class Program{/// <summary>/// 求两个double类型的数值的和/// &l…

前后端分离下,Spring Boot 请求从发起到响应的完整执行流程

以下是前后端分离架构下&#xff0c;Spring Boot 请求从发起到响应的完整执行流程&#xff0c;结合你提出的所有问题&#xff0c;按真实执行顺序和职责链条重新整理所有核心概念、结构、关键类、数据转换点和典型代码示例&#xff1a; 一、前端发起请求&#xff08;步骤1-2&…

基于sklearn实现文本摘要思考

和各位小伙伴分享一下使用sklearn进行文本摘要的思考。 第一版本 原理 提取式文本摘要的基本原理是&#xff1a; 将文本分割成句子 计算每个句子的重要性(权重) 选择权重最高的几个句子组成摘要 常用的句子权重计算方法&#xff1a; TF-IDF&#xff1a;基于词频-逆文档频…

OpenHarmony子系统开发 - DFX(三)

OpenHarmony子系统开发 - DFX&#xff08;三&#xff09; 五、HiTraceMeter开发指导 HiTraceMeter概述 简介 HiTraceMeter在OpenHarmony中&#xff0c;为开发者提供业务流程调用链跟踪的维测接口。通过使用该接口所提供的功能&#xff0c;可以帮助开发者迅速获取指定业务流…

2025年 能够有效提升AI的生成质量和逻辑严谨性 的通用型系统提示

以下是三个经过精心设计的通用型系统提示&#xff08;System Prompt&#xff09;&#xff0c;能够有效提升AI的生成质量和逻辑严谨性&#xff0c;适用于各类对话、分析和创作场景&#xff1a; Prompt 1 - 专家级分步验证模式 你是一个具备跨领域知识整合能力的超级AI&#xff…

python爬虫:小程序逆向实战教程

根据我之前发表的文章&#xff0c;我们进行延伸实战https://blog.csdn.net/weixin_64809364/article/details/146981598?spm1001.2014.3001.5501 1. 想要爬取什么小程序&#xff0c;我们进行搜索 2. 找到我们vx小程序的文件地址&#xff0c;我们就可以进行破解 破解步骤强看…

C语言变长数组(VLA)详解:灵活处理动态数据的利器

引言 在C语言中&#xff0c;传统的数组大小必须在编译时确定&#xff0c;这限制了程序处理动态数据的灵活性。C99标准引入的变长数组&#xff08;Variable-Length Array, VLA&#xff09; 打破了这一限制&#xff0c;允许数组长度在运行时动态确定。本文将深入解析VLA的语法、…

串口数据转换为IP数据

串口数据转换为IP数据是一种常见的通信技术,用于将传统的串行设备(如传感器、控制器等)接入现代的IP网络。以下是详细介绍: 1. 转换原理 串口数据转换为IP数据的过程涉及硬件和软件的结合,核心是将串行数据封装为TCP/IP或UDP/IP数据包,通过网络传输。具体步骤如下: 硬…

client-go如何监听自定义资源

如何使用 client-go 监听自定义资源 在 Kubernetes 中使用 client-go 监听自定义资源&#xff08;Custom Resource&#xff0c;简称 CR&#xff09;需要借助 Dynamic Client 或 Custom Informer&#xff0c;因为 client-go 的标准 Clientset 只支持内置资源&#xff08;如 Pod…

C++软件开发架构

文章目录 1.全局消息通信MsgHandler.h单元测试(QTest)MsgHandlerUnitTest.hMsgHandlerUnitTest.cpp 2.实例间通信InstMsgHandler.h单元测试InstMsgHandlerUnitTest.hInstMsgHandlerUnitTest.cpp 1.全局消息通信 1. 适用于类与类单个对象实例之间的通信&#xff0c;多个对象需要…

AI Agent设计模式一:Chain

概念 &#xff1a;线性任务流设计 ✅ 优点&#xff1a;逻辑清晰易调试&#xff0c;适合线性处理流程❌ 缺点&#xff1a;缺乏动态分支能力 from typing import TypedDictfrom langgraph.graph import StateGraph, END# 定义后续用到的一些变量 class CustomState(TypedDict):p…

Git三剑客:工作区、暂存区、版本库深度解析

一、引言&#xff1a;为什么需要理解Git的核心区域&#xff1f; 作为开发者&#xff0c;Git是日常必备的版本控制工具。但你是否曾因以下问题感到困惑&#xff1f; 修改了文件&#xff0c;但 git status 显示一片混乱&#xff1f; git add 和 git commit 到底做了什么&#x…

Python数据类型-list

列表(List)是Python中最常用的数据类型之一&#xff0c;它是一个有序、可变的元素集合。 1. 列表基础 创建列表 empty_list [] # 空列表 numbers [1, 2, 3, 4, 5] # 数字列表 fruits [apple, banana, orange] # 字符串列表 mixed [1, hello, 3.14, True] # 混合类型…

Keepalive+LVS+Nginx+NFS高可用项目

项目架构 分析 主机规划 主机系统安装应用网络IPclientredhat 9.5无NAT172.25.250.115/24lvs-masterrocky 9.5ipvsadm&#xff0c;keepalivedNAT172.25.250.116/24 VIP 172.25.250.100/32lvs-backuprocky 9.5ipvsadm&#xff0c;keepalivedNAT172.25.250.117/24 VIP 172.25.2…

【视觉与语言模型参数解耦】为什么?方案?

一些无编码器的MLLMs统一架构如Fuyu&#xff0c;直接在LLM内处理原始像素&#xff0c;消除了对外部视觉模型的依赖。但是面临视觉与语言模态冲突的挑战&#xff0c;导致训练不稳定和灾难性遗忘等问题。解决方案则是通过参数解耦方法解决模态冲突。 在多模态大语言模型&#xf…

AI比人脑更强,因为被植入思维模型【43】蝴蝶效应思维模型

giszz的理解&#xff1a;蝴蝶效应我们都熟知&#xff0c;就是说一个微小的变化&#xff0c;能带动整个系统甚至系统的空间和时间的远端&#xff0c;产生巨大的链式反应。我学习后的启迪&#xff0c;简单的说&#xff0c;就是不要忽视任何微小的问题&#xff0c;更多时候&#x…

AI 数理逻辑基础之统计学基本原理(上)

目录 文章目录 目录统计学统计学基本概念描述性统计数据可视化图表工具 汇总统计统计数据的分布情况&#xff1a;中位数、众数、平均值统计数据的离散程度&#xff1a;极差、方差、标准差、离散系数 相关分析Pearson 线性关系相关系数Spearman 单调关系相关系数 回归分析回归模…

无招回归阿里

这两天&#xff0c;无招回归阿里的新闻被刷屏了。无招创业成立的两氢一氧公司无招的股份也被阿里收购&#xff0c;无招以这种姿态回归阿里&#xff0c;并且出任钉钉的 CEO。有人说&#xff0c;这是对 5 年前“云钉一体”战略的纠偏。现在确实从云优先到 AI 优先&#xff0c;但云…

算法题(114):矩阵距离

审题&#xff1a; 本题需要我们找出所有0距离最近的1的曼哈顿距离 思路&#xff1a; 方法一&#xff1a;多源bfs 分析曼哈顿距离&#xff1a; 求法1&#xff1a;公式法&#xff0c;带入题目公式&#xff0c;利用|x1-x2||y1-y2|求出 求法2&#xff1a;曼哈顿距离就是最短距离 本…

LLM 性能优化有哪些手段?

LLM(大语言模型)性能优化是一个多维度、多层次的系统工程,涉及从提示工程到模型微调,从推理加速到系统架构优化等多个方面。以下是当前主流的优化手段及其技术细节: 一、提示工程(Prompt Engineering) 提示工程是优化LLM性能最直接、成本最低的方法,适用于快速原型开发…