《Kotlin入门实战》CH5 | 函数与函数式编程

Kotlin协程高并发服务器:四种核心模式与性能优化实战 并发编程是现代服务端开发的核心技术,通过合理利用计算资源提升系统吞吐量。Kotlin协程基于挂起函数和状态机机制,在用户态实现轻量级线程切换,避免了传统线程模型的内存开销和上下文切换成本。这种非阻塞并发模型特别适合I/O密集型场景,能够显著提升资源利用率和系统性能。在实际工程实践中,开发者需要掌握每请求一协程、生产者-消费者等核心模式,并注意调度器选择和资源管理。针对高并发服务器场景,Kotlin协程提供了结构化并发和背压处理等机制,帮助构建稳定高效的服务端应用,解决传统多线程模型在应对高并发请求时的性能瓶 阅读详情

函数与函数式编程

函数式编程与命令式编程最大的不同是:函数式编程的焦点在于数据的映射,命令式编程(imperative programming)的焦点是解决问题的步骤。

函数式编程和命令式编程比较

fun main() {

    val list = listOf<Int>(1, 2, 3, 4, 5)
    
    // 函数式编程
    println(list.filter { it % 2 == 0 })
    
    // 命令式编程
    for (i in list) {
        if (i % 2 == 0)
            println(i)
    }
}

如果式Java的话,还要写for(;;)遍历,函数式编程就显得可读性更好了。

1. 函数式编程

  1. 一等函数支持(first-class function):函数也是一种数据类型,可以作为参数传入另一个函数中,同时函数也可以返回一个函数。
  2. 纯函数(pure function)和不变性(immutable):纯函数指的是没有副作用的函数(函数不去改变外部的数据状态)。例如,一个编译器就是一个广义上的纯函数。在函数式编程中,倾向于使用纯函数编程。正因为纯函数不会去修改数据,同时又使用不可变的数据,所以程序不会去修改一个已经存在的数据结构,而是根据一定的映射逻辑创建一份新的数据。函数式编程是转换数据而非修改原始数据。
  3. 函数的组合(compose function):在面向对象编程中是通过对象之间发送消息来构建程序逻辑的;而在函数式编程中是通过不同函数的组合来构建程序逻辑的。

2. 声明函数

fun sum(v1: Int, v2: Int): Int {
    return v1 + v2
}

val sum = fun(v1: Int, v2: Int): Int { return v1 + v2 }

3. Lambda表达式

val list = listOf(1, 2, 3, 4, 5, 6, 7)
list.filter { it % 2 == 1 }

因为filter函数只有一个参数所以小括号被省略了

list.filter ({ it % 2 == 1 })

而filter函数的参数式一个函数,参数类型式predicate: (T) -> Boolean

{ it % 2 == 1 } 是一个简写的Lambda表达式
{ it -> it % 2 == 1 } //实际的Lambda 表达式

完整的写法是

val odd = {it:Int -> it % 2 == 1}
list.filter(odd)

可以看一下filter的源码

public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {
    return filterTo(ArrayList<T>(), predicate)
}// predicate 是传入的函数,调用filterTo方法

// filterTo方法中使用了predicate判断是否满足条件
// 如果满足条件则加入destination 容器里面

public inline fun <T, C : MutableCollection<in T>> Iterable<T>.filterTo(destination: C, predicate: (T) -> Boolean): C {
    for (element in this) if (predicate(element)) destination.add(element)
    return destination
}

4. 高阶函数

    val f = fun(x: Int) = x % 2 == 1
    val g = fun(s: String) = s.length
    val h = fun(g: (String) -> Int, f: (Int) -> Boolean): (String) -> Boolean {
        return { f(g(it)) }  // {}表示返回的是lambda表达式,如果没有返回的是boolean值了
    }
    
    val strs = listOf("a", "ab", "abc", "abcd")
    println(strs.filter( h(g, f) ))

使用typealias别名简化

typealias G = (String) -> Int
typealias F = (Int) -> Boolean
typealias H = (String) -> Boolean

val h = fun(g: G, f: F): H {
    return { f(g(it)) } //需要注意的是,这里的{} 是不能省略的
}
8923455-8c03d65aac7cd164.png
image.png

5. kotlin中特殊函数

kotlin包下的Standard.kt 文件中定义的方法

run()、apply()、let()、also()和with()、takeIf、takeUnless、repeat

1. run()

定义

public inline fun <R> run(block: () -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block()
}

使用

fun myfun(): String {
    println("执行了myfun 函数")
    return "这是myfun 的返回值"
}

fun main() {
    myfun()
    run({ myfun() })
    run { myfun() }
    run { println("A") }
}

结果

执行了myfun 函数
执行了myfun 函数
执行了myfun 函数
A

2. apply()函数

定义

public inline fun <T> T.apply(block: T.() -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block()
    return this
}

使用

   val list = ArrayList<String>().apply {
        add("1")
        add("2")
        add("3")
    }
    println(list)

结果

[1, 2, 3]

3. let()函数

定义

public inline fun <T, R> T.let(block: (T) -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block(this)
}

使用

list.let { println(it) }

结果

[1, 2, 3]

4. also()函数

定义

public inline fun <T> T.also(block: (T) -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block(this)
    return this
}

使用

fun testAlsoFun() {
    val a = "ABC".also {
        println(it) //输出:ABC
    }
    println(a)      //输出:ABC
    a.let {
        println(it) //输出:ABC
    }
}

结果

ABC
ABC
ABC

5. with()函数

定义

public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return receiver.block()
}

使用

    with(ArrayList<Int>()){
        add(1)
        add(2)
        add(3)
    }.let { println(it) }

结果

1
2
3
量化交易 米筐 案例:市值因子选股策略 案例:市值因子的选股策略 1.结果 获得超额收益 年化 49% 2. 从股票中选择市值小的股票 选定财务数据筛选 进行每日调仓(多因子选股调仓 周期频率会小一些) 3. 代码 估值有关指标 # 在沪深300股票中,选出市值比较小的10只股票 # 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。 def init(context): # 沪深300组合 stocks = index_components('000300.XSHG') # 沪深3 阅读详情

相关推荐

电子数据取证实战:从“平航杯”竞赛看计算机检材分析的关键技术与案例解析

本文通过'平航杯'电子数据取证竞赛案例,深入解析计算机检材分析的关键技术,包括USB设备追踪、浏览器历史分析、AI换脸取证、虚拟货币交易追踪等实战技巧。重点探讨了数字痕迹的发现与关联,以及电子取证工具链的应用,为从业人员提供实用的技术参考和案例分析。

www00的博客 536

kotlin修炼指南8—集合中的高阶函数

点击上方蓝字关注我,知识会给你力量Kotlin对集合操作类新增了很多快捷的高阶函数操作,各种操作符让很多开发者傻傻分不清,特别是看一些Kotlin的源码或者是协程的源码,各种眼花缭乱的操作符,让代码完全读不下去,所以,本文将对Kotlin中的集合高阶函数,进行下讲解,降低大家阅读源码的难度,下面看几个用的比较多的高阶函数使用。首先是sumOf,作为一个很方便的求和函数,它可以快速对集合内的某些参数...

eclipse_xu 2256

FX2N-2AD模块实战:从硬件连接到FROM/TO指令编程详解

本文详细解析FX2N-2AD模拟量输入模块的硬件连接与FROM/TO指令编程技巧,涵盖BFM缓冲存储器配置、梯形图程序设计及工程实战经验。通过实例演示如何实现精准信号采集与数据处理,特别针对PLC系统中的常见故障提供解决方案,助力工业自动化工程师高效完成设备调试与维护。

prometheus9mon的博客 507

Kotlin入门笔记(二) Kotlin 函数的简单介绍

前言:本教程最好在有JAVA的基础下进行学习 一、main函数的使用 (1) 学过java的小伙伴们应该知道,java的main方法是静态的,且写在class中。Kotlin就有所不同,一般的写法可以将main函数写在class外 class Test{ } /** 我是main入口函数 **/ fun main(args: Array<String>) { var test=Test(); println("main在class外执行!") } 运...

m0_46745664的博客 2486

ZW3D 二次开发-制作插件

1.Windows 7 SP1 或 Windows 10 或 Windows 11(推荐 Windows 11)2.Visual studio 2017-2022 (或 C/C++的任何其他集成开发环境)(推荐 Visual studio 2022)3.ZW3D 2023 或以上版本(建议使用与 ZW3D 一致的 API 的版本)4.Qt5.9.7(for Windows)博主学习使用环境的是:Windows 11 Version 24H2 + Visual studio 2022 + Qt5.9.7(fo

fhqiwmc的博客 810

【Coze搞钱实战】24. 从零实现精准用户画像:Coze+企业微信打造智能导购推送系统(附完整代码)

电商运营中,“客服重复询问用户需求、无法精准推荐”是转化率低的核心痛点——日均200人次咨询,73%的问题是重复的,首单转化率仅14%。本文基于Coze平台sys_uuid用户识别功能、企业微信API与多维表格,打造“用户行为→自动打标→标签存储→智能推送”全链路方案:通过分类分层标签体系捕捉用户偏好,Coze自动识别用户并打标,飞书多维表格存储标签数据,企业微信触发个性化推送。实操后可使客服重复询问率下降62%,意向客户转化率提升81%,首单转化率提升64%。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 543

《Kotlin入门实战》CH7 | 集合类

集合类 在Java类库中有一套相当完整的容器集合类来持有对象。Kotlin没有去重复造轮子(Scala则是自己实现了一套集合类框架),而是在Java类库的基础上进行了改造和扩展,引入了不可变集合类,同时扩展了大量方便实用的功能,这些功能的API都在kotlin.collections包下面。 集合类概述 集合层次 Iterable 可遍历...

落红不是无情物 168

高云FPGA系列教程(1):FPGA和ARM开发环境搭建

至此,高云FPGA和MCU开发环境就搭建完成了,整体还是比较简单的,几乎是一键完成,下一篇文章我们进行实际的FPGA和MCU开发。本文是高云FPGA系列教程的第1篇文章。

whik1194的博客 6186

《Kotlin入门实战》CH3 | 类型系统与可空类型

类型系统与可空类型 Kotlin属于静态类型编程语言,编程语言中类型系统定义: 如何将数值和表达式归为不同类型 如何操作这些类型 这些类型之间如何相互作用 类型系统 1. 类型系统作用 让编译器检查无意义、无效、类型不匹配的错误代码 代码更好读懂 利于抽象 char[] str = {'a','b','c'}抽象为String str = 'abc'...

落红不是无情物 159

用 ADT 连接 SAP S/4HANA Public Cloud 开发租户的完整落地指南

摘要:在SAP S/4HANA公有云中进行ABAP开发时,必须使用Development Tenant(客户端080)而非Customizing Tenant(客户端100)连接ADT工具。开发用户需具备SAP_BR_DEVELOPER角色且写权限不受限,开发对象应创建在结构包的子包中。连接前需确认正确的ABAP服务URL(通常为Launchpad URL去掉"/ui"),并通过运行控制台程序验证全链路功能。典型开发场景如通过BAdI实现业务校验时,需遵循Clean Core原则在指定包

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 337

基于YOLOv26的智能农业无人机巡检系统

本文提出了一种基于YOLOv26的智能农业无人机巡检系统。系统采用模块化设计,包含数据采集、预处理、目标检测、图像拼接、分析决策和部署控制六大核心模块。无人机搭载多光谱相机、RGB相机和热红外相机进行农田数据采集,通过YOLOv26实现作物病虫害、杂草及灌溉设备的检测。系统采用PyTorch、OpenCV等技术栈,支持无人机自动路径规划和多传感器数据采集,并包含数据增强和预处理功能。该系统可有效提升农业巡检效率,为精准农业提供智能化解决方案。

一键难忘的博客 807

《Kotlin入门实战》CH8 | 泛型

泛型 泛型是在Java5中引入的,泛型让集合框架可以重用代码,在没有泛型时候,集合框架中存储数据的类型都是Object,也就是说存入和取出数据都需要对对象进行强制类型转换。这就很可能出现错误。 1 类接口函数上使用泛型 泛型接口 interface Send<T>{ fun handleMessage(t : T) : T; } fu...

落红不是无情物 164

【Claude Code 源码解析教程】总体大纲

本教程旨在深入解析 Anthropic Claude Code 项目的源码架构和实现细节。Claude Code 是一个基于 TypeScript + Bun 构建的 AI 编程助手 CLI 工具,代号 "Tengu",具有复杂的多模块架构和丰富的功能特性。本教程基于Claude Code 的源码分析来生成,将帮助您全面掌握 Claude Code 的源码架构和实现细节,为开发类似 AI 编程助手工具奠定坚实基础。

rengang66的博客 386

《离线AI安卓APP》ch03 Kotlin 速成(只学这个项目用到的)

学习目标 读完本章,你应当能够: 说清 val 和 var 的区别,以及为什么本工程默认全用 val; 读懂并写出空安全三件套 ? / ?. / ?:,并解释为什么本工程几乎不用 !!; 用 data class + copy() 做"不可变更新",并说清它和"原地改列表"对 UI 刷新的影响;

ai2work的博客 953

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

使用官方 kotlin-sdk 构建 MCP 服务器:Kotlin MCP Server Development Expert 实战指南

在 awesome-copilot 仓库中,[agents/kotlin-mcp-expert.agent.md](https://link.gitcode.com/i/2f7f80456d37562744b8f84f38580d49) 定义了一位专注于"用官方 `io.modelcontextprotocol:kotlin-sdk` 构建 Model Context Protocol(MCP)服

gitblog_00373的博客 231

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Obsidian Git 大 Vault 提速的 3 条路径:obsidian-git 性能优化完整指南

你的 Obsidian Vault 笔记上千、附件成堆,装了 obsidian-git 之后,commit-and-sync 越来越慢,Source Control 视图动不动就卡住?这篇指南带你用 3 条路径逐级优化:从改插件设置到瘦身仓库,把文件改动后的列表刷新从"秒级等待"压回毫秒级,行作者信息(git blame)也能秒出。 ## 先自查:5 个典型症状对号入座 优化前先定位问题:卡顿

gitblog_01131的博客 1045

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

如何为Kotlin断言库Atrium编写自己的expectation函数:从1行Boolean检查到自定义Builder

Atrium 是一款开源的 **Kotlin 多平台断言(expectation)库**,支持 JVM、JS 与 Android,设计上对标 AssertJ 但提供了更灵活的错误报告与扩展能力。本文将带你 **如何为 Kotlin 断言库 Atrium 编写自己的 expectation 函数**:从一个 1 行代码的 Boolean 检查,逐步进阶到使用 `_logic` 与 `assertio

gitblog_00609的博客 431

Java/Kotlin TCP Socket TLS/SSL加密通讯实战指南

在网络编程中,TCP Socket是实现客户端与服务器端稳定双向通讯的基础技术。然而,明文传输的数据在公网环境中面临被截获和窃取的风险,因此数据加密成为保障通讯安全的核心原理。TLS/SSL协议作为业界标准,通过非对称加密进行密钥交换、对称加密保障传输效率,并利用数字证书实现身份认证,为数据传输提供了机密性、完整性和可信性三重保障。这一技术价值在于,它能有效防止中间人攻击和数据泄露,是构建安全网络应用的基石。在Java/Kotlin开发实践中,通过SSLSocket和SSLServerSocket可以便捷地

weixin_33845881的博客 527

5分钟上手Atrium断言库:第一个expect与读懂失败报告

Atrium 是 Kotlin 的开源多平台断言/期望库(expectation library),支持 JVM、JS 与 Android,以 `expect` 断言入口和"说人话"的失败报告著称。本文带你 5 分钟完成安装、写出第一个 `expect` 断言,并学会读懂它的失败报告。 ## Atrium 断言库是什么? Atrium 最初受 AssertJ 启发,但走得更远:它把"帮你理解哪

gitblog_00292的博客 857

google-drive-ocamlfuse 的 libfuse 3 绑定升级实录:从 ocamlfuse 到 fuse3 的四阶段迁移

本文基于仓库内的迁移计划文档 [docs/plans/fuse3-dependency-upgrade.md](https://link.gitcode.com/i/e5b4ee8e6031d53fd1dec9648828956d),完整复盘 google-drive-ocamlfuse 如何把 FUSE 绑定从 libfuse 2 的 `ocamlfuse` 包切换到 libfuse 3 的 `

gitblog_01150的博客 345

Atrium多平台测试实战:同一套断言如何跑在JVM、JS与Android上

Atrium 是一个开源的 **Kotlin 多平台测试断言库**(expectation/assertion library for Kotlin),支持 JVM、JS 与 Android 三大平台。它的核心卖点只有一句话:**在 commonMain 里写一次断言,JVM、JS、Android 全部复用**,失败时还能输出结构清晰、像"人话"一样的错误报告。这篇文章带你用官方样例项目,快速跑通

gitblog_00378的博客 424

学习笔记-Kotlin(3)

目录 1.字符串操作 2.数字类型 3.标准函数库 (1).apply (2).let (3).run (4).with (5).also (6).takeIf和takeUnless 1.字符串操作 indexOf():用法跟java相同 substring():字符串截取。跟java相同,但其中有一种用法是subString(range:Int) "frenk".su......

FrenkX72的博客 653

Kotlin多平台断言库Atrium完全指南:为什么它比AssertJ更能告诉你测试为什么失败

Atrium 是一款开源的 Kotlin 多平台断言库,同时支持 JVM、JS 和 Android。与常见的断言工具不同,它的设计目标只有一个:当测试失败时,用尽可能详细、可读的方式告诉你"哪里错了、为什么错"。本指南面向刚接触 Kotlin 测试的新手,带你快速理解 Atrium 的核心能力,以及它相比 AssertJ 在失败报告上的独特优势。 ## 🤔 断言测试的痛点:为什么失败? 传统

gitblog_01083的博客 750

CH34xUART 1.0.0 安卓库集成实战:适配Android 13,修复3个关键Bug

本文详细介绍了CH34xUART 1.0.0安卓库的集成实战,重点讲解了如何适配Android 13并修复3个关键Bug。内容涵盖现代Android开发环境配置、USB权限管理、串口参数设置以及性能优化技巧,帮助开发者高效实现USB串口通信功能。

weixin_30603633的博客 388

终极指南:Proton Mail Android app新手入门,5分钟搭建安全邮件系统

Proton Mail Android app是一款注重隐私保护的开源邮件客户端,让你轻松搭建属于自己的安全邮件系统。本指南将带你快速上手,完成从安装到基础设置的全过程,让你的邮件通信更加安全可靠。 ## 一、快速安装Proton Mail Android app 要开始使用Proton Mail Android app,首先需要获取应用。你可以通过以下步骤克隆项目仓库: ```bash g

gitblog_00552的博客 366

TIOBE 8 月编程语言排行榜发布:Python 势如破竹!

最新的编程语言榜单来啦!

优快云资讯 1万+
上一篇: 《Kotlin入门实战》CH4 | 类与面向对象编程
下一篇: 《Kotlin入门实战》CH6 | 扩展函数与扩展属性
KriyWu
博客等级 码龄9年 3粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值