当前位置: 首页 > 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.cnnetsun.cn/news/1448978.html

相关文章:

  • 告别拖拽对齐的折磨,分享一个 AI 驱动的架构图生成器 ArchGen
  • 本地 LLM 部署指南 - 隐私优先的 AI 开发环境搭建
  • 别再手动K帧了!用Mixamo+Unity 2022快速搞定3D角色动画(附完整项目文件)
  • 深入理解java多线程技术
  • CAE软件市场发展态势及优质代理商——今宏科技实践解析
  • 基于Qwen3-ForcedAligner-0.6B的语音合成前端优化方案
  • 当AI开始“做科研“:从万名爱因斯坦到全自动实验室,人类还剩什么?
  • Qwen3-TTS-Tokenizer:12Hz极致压缩语音编解码工具
  • OpenCV实战:LSD直线检测两种实现对比(附Python/C++代码)
  • Local SDXL-Turbo部署指南:Autodl中设置定时快照防止意外中断损失
  • wwwww
  • 如何解决华硕ROG笔记本色彩配置丢失问题:G-Helper高效恢复GameVisual设置实用指南
  • Java学习笔记_Day12
  • 保姆级教程:用Python从零复现Pan-Tompkins算法(含MIT-BIH数据库验证)
  • 基于Astar算法的智能小车路径规划模型:详细注释与参考文献附送
  • WiFi标签管理系统功能清单
  • 2026知识付费SaaS平台实测对比:创客匠人综合首选,真实数据说话
  • ADS1X58库详解:TI ADS1258/ADS1158高精度Σ-Δ ADC驱动实践
  • GME-Qwen2-VL-2B-Instruct与计算机组成原理教学:可视化理解CPU流水线
  • leetcode 1470. Shuffle the Array 重新排列数组-耗时100
  • RMBG-2.0快速入门:10分钟掌握背景移除技术
  • 用 OpenClaw + 微信实现 AI 自动回复(附完整接入流程)
  • Youtu-2B非遗文化问答:数字化保护系统搭建教程
  • AI创作春联实测:春联生成模型-中文-base生成效果展示与技巧
  • Stable Yogi 模型DevOps实践:Linux环境下的持续集成与监控
  • 如何选择合适的石英晶振用于频率仪表?
  • Sora技术解析:从Diffusion Transformer到文本生成视频的突破与应用
  • DSP竞价案例
  • Kimi-VL-A3B-Thinking GPU算力弹性扩展:vLLM支持多卡Tensor Parallel横向扩展
  • 一文讲清质量管理是什么意思?深入解读质量管理的核心与实践