当前位置: 首页 > news >正文

kotlin:函数式参数

在 Kotlin 中,函数式编程的核心特性之一就是将函数作为“一等公民”,这意味着函数可以像其他数据类型(如StringInt)一样,被当作参数传递、赋值给变量,或作为返回值。

这通常被称为高阶函数

1. 基本概念:高阶函数

高阶函数是指将函数作为参数或返回值的函数。

// 一个接受函数作为参数的高阶函数 fun calculate(x: Int, y: Int, operation: (Int, Int) -> Int): Int { return operation(x, y) // 调用传入的函数 } // 使用:传递一个 Lambda 表达式(函数字面值) val sum = calculate(10, 5) { a, b -> a + b } // 结果是 15 val product = calculate(10, 5) { a, b -> a * b } // 结果是 50

2. 函数类型

函数式参数的语法是(参数类型) -> 返回类型

// 定义一个函数类型变量 val greet: (String) -> Unit = { name -> println("Hello, $name!") } // 作为参数类型 fun executeAction(action: () -> Unit) { action() }

3. 传递函数式参数的几种方式

方式一:Lambda 表达式(最常用)
listOf(1, 2, 3).filter { it > 1 } // `it > 1` 是一个 Lambda
方式二:函数引用(::

如果已经有一个命名函数,可以直接引用它。

fun isEven(number: Int): Boolean = number % 2 == 0 val numbers = listOf(1, 2, 3, 4) val evens = numbers.filter(::isEven) // 引用现有函数
方式三:匿名函数

与 Lambda 类似,但可以更明确地指定返回类型。

numbers.filter(fun(num): Boolean { return num % 2 == 0 })

4. 有用的语法糖

  • 最后一个 Lambda 可移出括号:如果函数的最后一个参数是函数类型,Lambda 可以放在圆括号外。

    // 这两种写法等价 calculate(10, 5, { a, b -> a + b }) calculate(10, 5) { a, b -> a + b } // 更推荐,更清晰
  • 唯一参数是 Lambda 时可省略括号:如果函数只有一个参数且是函数类型,调用时可以直接写 Lambda。

    run { println("执行!") } // `run` 的函数签名是 `run(block: () -> R)`
  • 隐式参数it:当 Lambda 只有一个参数时,可以省略声明,用it指代。

    listOf("A", "B").forEach { println(it) } // 而不是 { str -> println(str) }

5. 带接收者的函数类型

这是 Kotlin 中 DSL(领域特定语言)和扩展函数式编程的基础。例如applywithrun标准库函数。

// 类型:`String.() -> Unit` 表示在 `String` 的上下文中执行的函数 fun buildString(action: StringBuilder.() -> Unit): String { val sb = StringBuilder() sb.action() // 在 sb 的上下文中调用传入的 Lambda return sb.toString() } val result = buildString { append("Hello, ") // 这里的 `this` 是 StringBuilder 实例 append("World!") } // result 为 "Hello, World!"

总结

Kotlin 的函数式参数是其现代、简洁、表达力强的关键。它广泛应用于:

  • 集合操作filtermapforEach

  • 作用域函数letapplyalsorunwith

  • 回调处理和异步编程

  • 构建类型安全的 DSL

掌握它,能让你写出更声明式、更易读的代码。

http://www.jsqmd.com/news/526695/

相关文章:

  • OpCore-Simplify:当黑苹果遇上智能决策,传统配置的终结者
  • SpringBoot 内置服务器(Tomcat/Jetty/Undertow)切换
  • 单相桥式全控整流电路在电力电子技术中的应用与Simulink仿真分析
  • CoPaw模型赋能数字人:驱动虚拟角色生成动态对话与表情
  • 用Python自动生成Verilog Testbench?这5个脚本让仿真效率提升300%
  • 企业级网络安全深度解析:从协议层到云原生的攻防实战与架构设计
  • SuperGrok 额度管理全攻略:从查看剩余到永久省额度,一文搞定(附带高ROI Prompt 模板)
  • 读2025世界前沿技术发展报告21载人航天和深太空探索
  • MusePublic艺术创作引擎算法优化:提升艺术生成效率
  • SpringAiAlibaba使用模型出现404报错问题
  • IDEA 新建web工程实战
  • 第一次降AI率不知道用什么?比话可能是最适合新手的选择
  • Qwen2.5-VL-7B-Instruct图文对话:支持多轮图片上下文+历史记忆回溯
  • AI原生城市服务平台:不是加个AI插件,而是城市服务的“原生进化”
  • Step3-VL-10B-Base模型管理实战:MySQL数据库存储元数据与推理记录
  • 拓朋A30模拟对讲机:乐园票务的“沟通小能手”
  • nfs 实际应用记录
  • RexUniNLU从零开始:DeBERTa中文语义理解系统环境部署全流程
  • Win10下高效统计代码行数:CLOC工具一键安装与实战指南
  • FFmpeg+NVIDIA硬编解码实战:从驱动安装到CUDA加速全流程指南
  • PX4与ESP8266无线数传配置实战:从固件烧录到QGC连接
  • YOLOv8训练踩坑实录:修改Ultralytics库源码,彻底告别自动下载yolov11.pt
  • 实测Qwen-Image-Edit-2511:换装效果惊艳,角色一致性太强了
  • GLM-OCR识别结果后处理技巧:基于规则与NLP纠错提升准确率
  • 人脸识别OOD模型部署指南:基于Docker的容器化部署
  • OpenClaw调试技巧:Qwen3.5-4B-Claude模型任务中断点设置
  • 告别Transformer!用PyTorch从零实现MLP-Mixer图像分类(附完整代码与避坑指南)
  • Gstreamer中MP4/FLV推流RTP的编码陷阱:为何必须解码再编码?
  • SEER‘S EYE预言家之眼自动化测试:构建模型推理服务的CI流水线
  • SpringBoot 配置 HTTPS(自签名证书+正式证书)