最强总结 | 带你快速搞定kotlin开发(下篇)

2020牛客NOIP赛前集训营-普及组(第四场)前3题 牛客竞赛第四场 4.项链 1.时间 题目描述: 众所周知,NOIP及其模拟赛的比赛时长均为3小时30分钟。 Alice和Bob参加了于h时m分开始的2020牛客NOIP赛前集训营-提高组,请你告诉他们比赛结束的时间。 输入格式: 共一行:一个形如hh:mm的字符串,表示比赛开始的时间。位数不足将填补0。 输出格式 共一行:一个形如hh:mm的字符串,表示比赛结束的时间。位数不足请填补0。 样例输入: 00:00 样例输出: 03:30 题解: 先把输入的时间换成分再 +++ 210 (也就是3小时30分 阅读详情

关注我,你的眼睛会怀孕

Kotlin必知必会(下)

①前言

通过前面两篇文章的介绍,我们对kotlin有了初步的了解(没看的同学可以通过点击话题跳转回去阅读),现在去动手写kotlin代码或者阅读一些kotlin源码应该不成问题了。今天我们主要围绕函数来展开讲解一下kotlin的函数。

在Java中的函数比较简单,通常情况下我们会将某些特定的操作(为了达成某个目的的一段代码逻辑)封装成一个函数,方便不同的地方调用。当然在kotlin中函数也是同样的作用了。


要点:

高阶函数的概念  
高阶函数配合内联函数使用优点  
几个非常有用的高阶函数    
集合变换 filter  map   fold
与Java8的stream比较(饿汉式和懒汉式)


②高阶函数的概念

概念:所谓高阶函数,是指它可以接受一个函数作为参数,或者返回值为函数。

其实之前的文章中已经用过了,比如集合的filter函数,看下当时我们是怎么使用的:

val youngPersonList = users.filter { it.age < 20 }

在集合users里面过滤出年龄小于20岁的人,这其实就是调用参数为函数类型的高阶函数,我们看下filter的源码:

/**
 * Returns a list containing only elements matching the given [predicate].
 */
public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {
    return filterTo(ArrayList<T>(), predicate)
}

可以看到filter函数接受一个参数,参数的类型是 (T) -> Boolean ,这种就是kotlin中的函数类型,其中的T为函数的参数类型,Boolean是函数的返回类型,也就是说,我们的调用最开始应该是这个样子的:

users.filter({user:User ->
    user.age < 20
})

上面这种就是一种创建函数类型实例的一种方式:Lambda表达式,基于kotlin的一些规约:

  • Lambda 表达式包含在大括号之内, 在完整语法形式中, 参数声明在大括号之内, 参数类型的声明是可选的, 函数体在 -> 符号之后. 如果 Lambda 表达式自动推断的返回值类型不是 Unit, 那么 Lambda 表达式函数体中, 最后一条(或者就是唯一一条)表达式的值, 会被当作整个 Lambda 表达式的返回值.

  • 如果函数的最后一个参数是一个函数, 那么如果使用 Lambda 表达式作为这个参数的值, 可以将 Lambda 表达式写在函数调用的括号之外

  • 如果 Lambda 表达式是函数调用时的唯一一个参数, 括号可以完全省略

  • 如果编译器能够自行识别出 Lambda 表达式的参数定义, 那么我们可以不必声明这个唯一的参数, 并省略 -> 符号, 这个参数会隐含地声明为 it

所以,最后我们省略了不必要的部分,调用高阶函数filter时就成了一行users.filter { it.age < 20 },注意函数的调用是需要有函数栈的操作的,所以我们一般高阶函数都会声明成内联的。

③常用的函数

接下来我们还要介绍一些对我们比较有用常用的高阶函数: 
 
let、run、also、apply这四个用法差不多,简单写个应用的场景看一下:

intent.extras?.let { 
    it.getString("")
    it.getInt("")
    it.getLong("")
}

相信大家一定都有这样的经历,在Activity的onCreate()中,通过intent获取extra中的数据,通过安全调用符和let函数,我们就可以安心的在lambda的函数体中使用extras。

接下来重点说下use函数,需要注意的是use是针对Closeable的扩展函数,所以只能通过Closeable的实例来调,use函数为我们节省了大量的代码,我们在操作文件流的时候总是会写一些try catch以及关闭流的操作,使用use后,这些都不需我们手动写,use帮我们做了,以从文件中独流的例子:

File("build.gradle").inputStream().reader().buffered().use {
    println(it.readLines())
}

只要上面的lambda表达式执行完的时候,相关的close操作会自动被执行,这个我们可以看下use的源码就清楚了:  
不仅帮我们trycatch了,关流的操作也一点不含糊。一个字:爽

④常用的几个集合扩展函数

前面多次提及集合的filter函数,其实有几个集合变换的函数我们需要拿出来分析一下,首先,当然还是filter:  

filter就是将一个集合通过一个函数来过滤出另一个集合,这个我们都很容易理解。

接下来,我们看下map这个函数,通过直译过来就是映射的意思,函数的作用确实也是如此,该函数通过遍历集合的每一个元素,通过函数体里面的逻辑一一处理后,生成新的一个集合,过程如下图所示: 

其实Java里面也提供了相似的方法,从Java8开始,提供了stream()函数,可以做流水线的操作,如下图所示:  

上图中数据的流程是,list进行遍历,当遍历到第二个元素,满足filter的条件,将第二个元素的值 2 送到map当中,map通过自己的算法得出5,将5放到forEach方法中输出,发现没有,它并没有在filter中全部遍历完再送到map函数,而是生产出一个结果就输送到流水线的下个函数。

当然了kotlin也可以实现一样的结果,通过asSequence函数,如下所示: 

但是,上面的流水线操作一定要在最后调用forEach(流水线开关),如果不调用forEach的话,filter和map也不是不会调用的,通常称作懒序列,当然一些聚合操作也可以充当开关。

但是kotlin显然可以不用调用asSequence函数,通过集合直接调用,那么如果是直接通过集合来调用,显然就相当于先调用filter函数,全部执行完返回一个列表,然后新的列表集合调用map,以此类推最后调用到forEach函数。这个和asSequence显然不同,我们称为饿汉式。

除了集合变化的操作,还有一些集合聚合的操作:sum、reduce、fold,以fold函数为例,fold函数提供两个参数,第一个参数是一个初始值,第二个参数是进行操作的函数,第一次运算的时候是以第一个参数也就是初始值和你集合中的第一个元素进行运算,得出的值所谓第二轮计算的初始值,再和集合的第二个元素进行运算,以此类推,知道最后计算出一个值(不是集合)。可以参考下方的示意图: 
 
reduce函数基本和fold函数一样,只不过没有初始值,这里就不再分析了。

ps:文中部分图来自互联网,如有侵权请联系作者删除

扫码关注我

一起感悟技术魅力

点分享

点收藏

点点赞

点在看

PyTorch 源码解读之 nn.Module:核心网络模块接口详解 PyTorch 源码解读系列更新啦~ 阅读详情

相关推荐

Android Studio 接入 DeepSeek 实战指南:API 桥接与本地 Ollama 方案

代码生成大模型(如 DeepSeek-Coder)正成为 Android 开发提效新范式,其核心原理是通过标准化 API 协议(如 OpenAI 兼容接口)或本地推理引擎(如 Ollama)与 IDE 对接。技术价值在于绕过官方生态限制,实现 Kotlin/Compose/Room 等安卓技术栈的智能补全与重构。典型应用场景包括协程 Retrofit 封装、Java 到 Jetpack Compose 的自动化迁移、以及离线环境下的安全代码生成。本文聚焦实测可行的两条主线:基于 CodeGPT 插件的 De

weixin_30920853的博客 494

c++ | 有趣的动态转换之 delete 崩溃探究兼谈基类虚析构的重要性

使用 delete 来释放 new 出来的指针会崩溃?多态基类的析构函数为什么一定要是虚函数?本文力求从汇编角度进行探究背后的原因。

1756

Android平台Lua脚本开发:从环境搭建到自动化实战

脚本语言作为轻量级、解释执行的编程工具,在自动化、快速原型和逻辑热更新等场景中具有独特优势。其核心原理是通过嵌入宿主程序或独立解释器,实现动态代码加载与执行,从而提升开发灵活性和效率。在移动开发领域,Android平台对脚本化技术的需求日益增长,特别是在自动化测试、设备管理和轻量级工具开发等应用场景中。本文聚焦于Lua这一轻量高效的脚本语言在Android上的实践,详细解析了通过LuaDroid等集成环境快速上手的路径,并深入探讨了文件操作、系统命令调用等热词相关的自动化脚本编写技巧,为移动端开发者提供了一

读书、思考、生活 514

pytorch module 源码

https://github.com/pytorch/pytorch/blob/27027a48041be0931938c4ea057419545003f3f6/torch/nn/modules/module.py#L137 from collections import OrderedDict, namedtuple import functools import itertools ...

moshiyaofei的博客 2915

Flutter与Unity混合开发性能优化实战:从卡顿到丝滑的完整解决方案

在移动应用开发中,混合开发架构常被用于整合不同引擎的优势,例如结合Flutter的跨平台UI能力与Unity的高性能3D渲染。其核心原理在于通过原生层桥接两个独立的运行时环境,实现通信与渲染协同。这种架构的技术价值在于能够打造兼具丰富2D交互与沉浸式3D体验的复合型应用,广泛应用于电商产品展示、教育仿真、AR/VR等场景。然而,性能瓶颈是混合开发面临的主要挑战,尤其是当Flutter与Unity在**视图嵌入**模式下协同工作时,容易出现渲染冲突、内存飙升与通信延迟问题。本文聚焦于通过**纹理传递**优化、

weixin_30920853的博客 358

Claude Code深度解析:代码语义理解与工程级AI协作者实践

AI编程工具正从语法补全迈向代码语义理解——这一范式升级要求模型具备AST解析、上下文建模与工程约束识别能力。基于抽象语法树(AST)的语义分析,使AI能区分`list.isEmpty()`与`list.size() == 0`的业务等价性;128K上下文支持则真实适配微服务链路调试等复杂工程场景。其技术价值在于将AI定位为‘人主导、AI协作者’,强调渐进式生成、安全边界意识与设计决策前置,而非黑盒输出。典型应用场景包括遗留系统重构、多模块联调诊断、Spring生态安全重构及跨语言API契约同步。本文聚焦C

weixin_30338481的博客 419

python中map的排序以及取出map中取最大最小值

map排序: 1.按key排序: items=dict.items() items.sort() sorted(dict.items(),key=lambda x:x[0],reverse=False) 2.按value排序 sorted(dict.items(),key=lambda x:x[1],reverse=False) (ps:在python2.x中还是有c...

weixin_30565327的博客 2225

Android应用静态分析利器:Androguard框架核心解析与自动化实战

在移动安全与逆向工程领域,静态分析是理解应用内部逻辑、检测潜在风险的基础技术。其核心原理在于不运行程序的情况下,通过解析二进制文件结构(如APK、DEX)来提取代码、资源和元数据信息。这项技术的价值在于能够自动化、规模化地审查应用行为,广泛应用于恶意软件检测、隐私合规审计、漏洞挖掘等场景。本文聚焦于实现这一过程的强大工具——Androguard,一个基于Python的Android应用逆向工程框架。它通过提供可编程的库接口,允许开发者深度解析APK的Manifest、反编译DEX字节码、构建控制流图,并支持

congsong2560的博客 379

最强总结 | 带你快速搞定kotlin开发(上篇)

关注我,你的眼睛会怀孕Kotlin必知必会(上)1.1 函数:funsum(a:Int,b:Int):Int{ returna+b } //对于只有一行...

吴延宝 879

【医学图像分割网络】之Res U-Net网络PyTorch复现

【医学图像分割网络】之Res U-Net网络PyTorch复现 1.内容 U-Net网络算是医学图像分割领域的开山之作,我接触深度学习到现在大概将近大半年时间,看到了很多基于U-Net网络的变体,后续也会继续和大家一起分享学习。这次分享ResNet+U-Net的一个改进版,ResNet本身就是一个十分优秀的backbone,目前应用仍然十分广泛,我们融合进ResNet后,我们就可以使得U-Net进行迁移学习了。 1.将Resnet作为encoder替换U-Net原始结构 2.U-Net提出时间较早,当时还没

qq_39071739的博客 1万+

RAW、RGB、YUV图像格式的采样与存储原理详解

本文详细解析了RAW、RGB和YUV三种核心图像格式的采样与存储原理。RAW是传感器原始数据,信息完整但需后期处理;RGB直接对应显示,直观但数据量大;YUV通过亮色分离与色度下采样,在保证观感的前提下大幅提升传输与存储效率,是视频编码与流媒体的主流格式。理解其差异是图像处理与视频开发的基础。

e4f5g6h7的博客 516

kotlin编译失败_最强总结 | 带你快速搞定kotlin开发(上篇)

关注我,你的眼睛会怀孕Kotlin必知必会(上)1.1 函数:funsum(a:Int,b:Int):Int{returna+b}//对于只有一行的函数,kotlin可以这么简写,爽不?funsum(a:Int,b:Int):Int=a+b可以看到函数的声明是通过fun关键字的,函数的参数类型和参数名的位置跟Java是相反的,中间使用:...

weixin_33958871的博客 591

【社区分享】从零开始学习 TinyML,建立 TensorFlow 深度学习模型(技术优化篇)

本文来自社区投稿与征集,作者王玉成,ML&IoT Google Developers Expert,温州大学智能锁具研究院总工程师。 了解更多:https://blog.youkuaiyun.com/wfing 经过前面几章的讨论,我们了解了TinyML 的概念,完成了一个最简单的TinyML 的模型并且运行在微控制器上,得出最基本的结果。但是在实际的工程应用中,模型建立之后,也需要再进一步结合许多优化方面的技术,这就是我们接下来想要探讨的。 5. 优化 TinyML 这本书也详细的向我...

tensorflowforum的博客 1万+

最强总结 | 带你快速搞定kotlin开发(中篇)

关注我,你的眼睛会怀孕Kotlin必知必会(中)1.1 再讲构造器主构造器、次构造器、初始化代码块、构造属性//在类名后面直接写的构造器称为主构造器,age直接在构造器里声明的,称为构...

吴延宝 367

【抖音滑动验证码风控分析】

文章摘要:通过对比正常响应与验证码风控响应的头部信息,发现两者存在显著差异。正常响应返回JSON格式数据(Content-Type: application/json)并采用分块传输(Transfer-Encoding: chunked),而风控响应仅返回空文本(Content-Type: text/plain,Content-Length: 0),并通过X-Vc-Bdturing-Parameters等特殊头字段传递风控信息。这些差异主要体现在内容类型、数据传输方式和风控标识参数上,为风控识别提供了关键特

qq_44990881的博客 1099

Apache Paimon快照管理实战:如何避免Flink作业中的反压问题?

本文深入探讨了如何通过优化Apache Paimon的快照管理机制来避免Flink作业中的反压问题。详细解析了同步与异步快照过期模式的适用场景及配置建议,并提供了Checkpoint策略与状态后端的协同优化方案,帮助提升实时数据处理的性能和稳定性。

i1j2k的博客 177

最强整理:五步搞定Android开发环境部署,通用流行框架大全

前言 一个Android开发的朋友跟我谈他面试经历,上周去爱奇艺面试,其他问题都答得不错,面试官问了一个哈夫曼算法的题没答出来,后来面试官很明确的说,我们还是想找一个会些算法基础的。 如果之前有学过数据结构和算法,建议大家不定时的去刷刷算法题 因为从面试的角度来讲,目前 BAT 和 TMD 等一线互联网企业或多或少都会有几个算法题,而对应届毕业生来说,算法的要求度则更高!这里可以分享一下我收集整理的数据结构算法题含答案。 背景介绍 Android 项目一般使用 gradle 作为构建打包工具,而其执行速度

m0_53537576的博客 182

【影像组学入门百问】1#---#3

理论上讲三大主流平台Windows, Linux和MacOS均可进行影像组学研究。根据笔者实际经验,如果内存不足可能导致软件罢工,其余显示、GPU等均非必要。显示:最小分辨率为1024×768(推荐为1280×1024或更好)。Slicer中的许多计算都是多线程的,并且将受益于多核,多CPU配置。计算机需要足够的内存和图形功能将原始数据和处理结果保存在其内存中。如涉及深度学习等方法的研究需根据实际需求配置电脑,无法一概而论。接口设备:推荐使用带滚轮的三键鼠标。内存:超过4GB(推荐8G以上)。

weixin_38594676的博客 1483

Zotero Style 完整使用指南

深夜,你又一次点开 Zotero 文献库,几百条记录混在一起,哪篇读完了、哪篇只开了个头,全靠翻文件夹回忆。Zotero Style 是一款免费的 Zotero 插件,把阅读进度条、智能标签、文献关系图谱直接塞进你熟悉的列表界面,让文献管理从"凭感觉"变成"看得到"。接下来 5 分钟,从装好到跑通核心流程。 ## 一、旧流程 vs 新流程 | 环节 | 以前 | 装上 Zotero Style

gitblog_00263的博客 341

【AI应用实战-OpenCode】OpenCode安装部署(一)

OpenCode是一款2026年流行的开源AI编程工具,兼具轻量代码编辑器和智能编码代理功能。其核心优势包括:完全免费开源(MIT协议)、全平台兼容、支持75+大模型(含本地部署)、内置完整编程功能链(代码补全/Git集成/AI调试等),且所有数据本地存储确保隐私安全。相比Copilot等商业工具,OpenCode提供更自由的模型选择和零门槛使用体验。安装要求Windows10+/macOS12+/Linux主流发行版,仅需200MB空间和4G内存。该工具完美兼容VSCode生态,支持终端/桌面/IDE三种

2422

Python 爬虫进阶技巧:定时爬虫任务实现无人值守采集

常规爬虫多依赖手动触发脚本运行,单次采集完成后需人工二次启动,无法满足日常周期性数据监控、行情抓取、资讯同步、业务台账定时归档等常态化采集需求。搭建可自主调度、自动启停、周期循环的定时爬虫任务,脱离人工干预实现无人值守全自动采集,是爬虫从临时脚本走向工程化落地的关键一步。schedule 轻量定时库官方文档APScheduler 高级定时框架官方文档Python time 内置模块官方文档Linux crontab 定时任务官方手册。

2503_91057718的博客 1117

如何用开源炉石脚本5分钟搞定每日任务:智能自动化工具完全指南

还在为炉石传说每天重复的日常任务感到疲惫吗?想要测试新卡组却苦于没有足够时间?这款开源炉石脚本正是你需要的智能游戏助手!基于Java和Kotlin开发的专业自动化工具,能够帮你解放双手,让游戏体验更加轻松愉快。 ## 🎮 为什么你需要这款炉石脚本? 想象一下:每天只需5分钟,就能完成原本需要30分钟的日常任务。这款炉石传说脚本不仅是一个简单的自动化工具,更是一个智能决策系统,它能够模拟真人玩

gitblog_00408的博客 251

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android开发者的AI三线并行实战:Claude、GPT、Gemini分工指南

在Android开发中,大模型并非通用解题器,而是需按场景精准调用的工程工具。由于Android生态存在API版本碎片化、框架深度耦合、硬件协议私有化等独特约束,单一模型难以覆盖全链路需求。Claude Sonnet在Kotlin语义理解与生命周期合规性上表现稳健,适合核心代码修正;Gemini 3.1 Pro凭借超长上下文与低成本优势,专精于文档解析、日志聚类等批量信息处理;GPT-5.4则强于跨模态整合与方案权衡,适用于软硬协同、合规对齐等复杂决策场景。这种三线并行模式,本质是将时间成本、金钱成本与风险

weixin_30700977的博客 360

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

2021年Java开发教程合集:IntelliJ IDEA下载、入门教程、最新资讯!

IntelliJ IDEA是Java语言开发的集成环境,IntelliJ在业界被公认为优秀的Java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、 创新的GUI设计等方面的功能可以说是超常的。 点击即可下载IntelliJ IDEA最新试用版 入门系列教程: 如何创建您的第一个Java应用程序 如何进行调试 如何添加jar包 常用快捷键介绍 如何自定义键盘快捷方式 排名前5的键盘导航快捷方式 如何为现有Intell

qq_42444778的博客 626

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

2026 年上鸿蒙别再试错了:选框架看这篇

大家好,我是胡琦。这两年我和很多开发者聊鸿蒙生态(OpenHarmony / HarmonyOS NEXT)时,几乎每个人都会问同一个问题:“我现有的跨平台代码,到底能不能跑在鸿蒙上?“如果能跑,要改多少?“选哪个框架最稳?“手机能跑,PC 能不能也一起搞定?“有没有成熟仓库可以直接抄作业?所以我把自己最近一段时间的调研结果整理成了一份**《2026版:跨平台框架适配鸿蒙信息汇总表》**,你可以把它当成一张“鸿蒙通行证地图”。

sinat_34365157的博客 1380

Java、C#、C++核心对比:从设计哲学到实战选型指南

在软件开发领域,编程语言是构建数字世界的基石,其设计哲学深刻影响着开发效率、系统性能与可维护性。从原理上看,语言通过不同的内存管理机制(如自动垃圾回收与手动管理)、运行时环境(虚拟机与原生编译)来平衡控制力与安全性。这种技术差异直接决定了其核心价值:是追求极致的性能与控制,还是侧重开发效率与生态完整性。因此,不同的语言自然适配于差异化的应用场景,例如企业级后端、云原生服务、系统软件或实时嵌入式开发。本文聚焦于Java、C#和C++这三大主流语言,深入剖析其各自的**内存管理**策略与**生态系统**构成,为

weixin_30565199的博客 565
上一篇: 最强总结 | 带你快速搞定kotlin开发(中篇)
下一篇: 最强总结 | Java-Kotlin双译手册,收藏必备
IT烂笔头
博客等级 码龄15年 621粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值