Kotlin 编程实战

2023-11-08

code小生 一个专注大前端领域的技术平台

公众号回复Android加入安卓技术群

导读:Kotlin诞生于2011年,开源于2012年,吸收了Java等语言的优良特性,提供了令人惊艳的编程体验,是编程语言界名副其实的“后浪”。

欢迎来到Kotlin的世界!

Kotlin是2011年由JetBrains推出的新一代编程语言。最初基于JVM,如今已向Native、JavaScript、数据科学等多个领域迈进。Kotlin是一种广泛的通用语言。你可以在任何原先使用Java的地方以及其他更多场景中使用它。

根据2020年2月JVM Ecosystem的数据,在JVM上Kotlin的份额已经仅次于Java,位居第二。2017年Google官方宣布Kotlin为Android的开发语言后,Kotlin的发展势头更为迅速,已成为编程语言界的又一颗新星,在业界得到了广泛的关注。

如今Kotlin已经足够成熟,众多Android开发者迫切需要一本入门级的Kotlin编程书籍,以顺利从Java过渡到Kotlin。

 

《Kotlin编程实践》一书通俗易懂,作者从向你展示如何安装Kotlin以及为你的项目配置它讲起,教会你如何在Java环境、浏览器中或作为一个独立的应用程序来运行Kotlin。用大量简单的示例程序清晰地解释了Kotlin的语法数据结构函数式编程等主要特性,是对Kotlin初学者非常有帮助的一本工具书。

Kotlin的版本迭代非常迅速,相关的书籍、文章和教程很容易就会被打上“过时”的标记。本书基于Kotlin持续时间长、语法特性非常成熟的1.3版本编写,除了版本够新之外,内容的组织方式也非常讲究,采用了抛出问题、回答问题的方式,既适合新手入门通读,也适合老手作为资料重点翻阅。相比之下,本书对初学者更为友好,负责翻译本书的禹昂更是Kotlin中文官网的主要翻译贡献者之一,所有的概念和术语都完全依照中文官网的翻译标准进行推敲,相信大家的阅读体验会如同查阅中文官网一般。

本书将带给你直接而实用的帮助,可以指导你在Kotlin旅途中快速进步。本书是Kotlin必不可少的操作指南,每个开发者都应将其放在案头,以支持日常工作。

 

主要内容

本书分为13章,每一章都是独立的,但本书引用了许多其他资料。你可以按任意喜欢的顺序阅读本书。

第1章讲解了安装并运行Kotlin的基本过程,包括使用REPL,使用诸如Maven以及Gradle等构建工具,以及在Graal中使用原生镜像生成器。

第2章讲解了Kotlin的基本特性—例如可空类型、操作符重载以及类型转换,然后介绍了一些更深奥的问题,包括按位移位操作符或者在Pair类上编写扩展函数等。

第3章重点介绍了Kotlin的面向对象特性,而该部分内容可能会让其他语言的开发者对此感到惊讶或不明所以。它包含如何使用const关键字、Kotlin如何处理幕后属性、延迟初始化以及令人恐惧的Nothing类,这些内容一定会令现有的Java开发者感到困惑。

第4章只有很少的一部分内容,其中涵盖一些需要被解释说明的函数式特性。函数式编程概念会始终贯穿全书,特别是当我们谈论集合、序列以及协程时,但该章中包含的一些有用的技巧可能会让你感觉到不同寻常或非常有趣。

第5章介绍了数组与集合,主要介绍一些不那么为人所知的方法,例如集合解构、按多个属性排序、在集合上构建窗口,以及创建数列。

第6章展示了Kotlin如何惰性处理序列中的元素,类似于在Java中使用流的方式,内容包含生成序列、在序列中生产元素以及使用无限序列。

第7章涵盖了Kotlin独有的另一个主题:在对象的上下文中执行代码块的函数。诸如let、apply以及also这类函数在Kotlin中非常有用,该章会说明为什么以及如何使用它们。

第8章讨论了Kotlin中的一个便捷特性:如何实现委托。委托可以让你使用组合而不是继承,Kotlin的标准库包含了一系列的委托,例如lazy、observable以及vetoable。

第9章涵盖了有关测试的重要主题,将会重点关注JUnit5。在当前版本下,JUnit已经被设计为可以与Kotlin良好地配合使用,其中包括常规用法以及在Spring框架应用程序中使用。该章会讨论使编写与执行测试更加容易的几种方式。

第10章涵盖了一些专门用于资源管理的方法,包括文件I/O,以及在多种情况下具有广泛适用性的use函数。

第11章介绍了其他类别的书中不容易找到的主题。诸如如何获取当前Kotlin版本,如何强制when语句在即使没有返回值的时候也要覆盖所有情况,以及如何在正则表达式中使用replace函数。此外,也讨论了TODO函数和Random类,以及如何与Java异常处理集成。

第12章涉及对Kotlin非常友好的Spring框架与Spring Boot,少量内容展示了如何将Kotlin类作为托管的bean、如何实现JPA持久性,以及如何在需要的时候进行依赖注入。

第13章介绍协程。协程是Kotlin中最受欢迎的功能之一,也是这门语言并发与并行编程的基础,内容包含基础知识,例如构建器与调度器、如何取消与调试协程,以及如何在自定义的Java线程池中运行它们。

这13章的内容不需要按特定顺序阅读。它们相辅相成,你可以从任何地方开始阅读。章节分组提供了一种将相似内容放在一起的方式,但是我们还是希望你可以在各章节之间自由跳跃从而解决你当前可能遇到的任何问题。

 

通过阅读本书,你将:

  • 掌握函数式编程概念,包括 lambda 表达式序列并发。 

  • 学习如何使用委托、延迟初始化作用域函数。 

  • 学习 Kotlin 与 Java 互操作的能力并使用 Kotlin 访问Java 库。

  • 能够编写扩展函数

  • 能够使用诸如 JUnit5 之类的实用库。

  • 在特定的开发框架(例如 Android Spring)内获得实践经验。

 

作者简介

Ken Kousen是Java Champion、Oracle Groundbreaker Ambassador与JavaOne Rock Star三个奖项的获得者。Ken在他自己的公司 Kousen IT开发软件并教授软件开发课程。同时也是JetBrains官方认证的Kotlin培训合作伙伴。

 

译者简介

乔禹昂,携程机票移动端高级工程师,长期在工作中将 Kotlin 用于实践,Kotlin界的优秀“后浪”。Kotlin 中文社区成员,官方文档译者。主要负责翻译协程、Native 部分的多篇官方文档,曾担任北京 GDG/Kotlin Everywhere 大会讲师,分享了《Kotlin 函数式编程》的主题。对 Kotlin Native、Kotlin Multiplaform 等实验性新技术也颇有研究。

目录

●第1章 安装并运行Kotlin11

1.1 在没有本地编译器的情况下运行Kotlin11

1.2 在本地安装Kotlin13

1.3 在命令行中编译并运行Kotlin15

1.4 使用Kotlin REPL16

1.5 执行Kotlin脚本17

1.6 使用GraalVM构建独立应用程序18

1.7 为Gradle添加Kotlin插件(Groovy语法)21

1.8 为Gradle添加Kotlin插件(Kotlin语法)24

1.9 使用Gradle构建Kotlin工程26

1.10 使用Maven编译Kotlin27

 

●第2章 Kotlin基础31

2.1 在Kotlin中使用可空类型31

2.2 在Java中添加可空指示器34

2.3 为Java添加重载方法36

2.4 显式类型转换40

2.5 打印不同的进制42

2.6 数幂44

2.7 使用移位运算符46

2.8 使用位布尔运算符49

2.9 使用to函数创建Pair实例52

 

●第3章 Kotlin中的面向对象编程55

3.1 理解const与val的不同之处55

3.2 创建自定义的getter与setter56

3.3 定义数据类59

3.4 幕后属性技术62

3.5 操作符重载65

3.6 使用lateinit进行延迟初始化67

3.7 使用安全转换函数、恒等操作符,以及Elvis操作符覆盖equals函数70

3.8 创建单例72

3.9 无事生非75

 

●第4章 函数式编程79

4.1 在算法中使用fold79

4.2 使用reduce函数进行归约82

4.3 使用尾递归84

 

●第5章 集合89

5.1 使用数组89

5.2 创建集合92

5.3 为已存在的集合创建只读视图94

5.4 从集合构建map96

5.5 当集合为空的时候返回默认值97

5.6 将变量限制在给定区间98

5.7 处理集合中的窗口100

5.8 解构list102

5.9 将多个属性排序103

5.10 自定义迭代器105

5.11 根据类型过滤集合107

5.12 在数列中创建区间108

 

●第6章 序列113

6.1 使用懒序列113

6.2 生成序列115

6.3 管理无限序列117

6.4 以固定间隔从序列生成元素119

 

●第7章 作用域函数123

7.1 使用apply函数在构造结束之后初始化对象123

7.2 使用also函数进行其他操作124

7.3 使用let函数与Elvis126

7.4 使用let函数代替临时变量128

 

●第8章 Kotlin委托131

8.1 使用委托实现组合131

8.2 使用lazy委托134

8.3 确保值不为空136

8.4 使用observable与vetoable委托137

8.5 使用映射作为委托141

8.6 创建你自己的委托143

 

●第9章 测试147

9.1 设置测试类的生命周期147

9.2 使用数据类进行测试152

9.3 使用帮助函数并使用默认参数154

9.4 使用不同的参数重复JUnit 5的测试156

9.5 使用数据类进行参数化测试159

 

●第10章 输入/输出161

10.1 使用use函数管理资源161

10.2 写文件164

 

●第11章 其他167

11.1 在代码中获取Kotlin版本号167

11.2 重复执行lambda表达式169

11.3 强制when语句进行穷举170

11.4 在正则表达式中使用replace函数172

11.5 转换为二进制字符串并返回174

11.6 使一个类可执行176

11.7 测量经过时间179

11.8 启动线程180

11.9 使用TODO强制完成183

11.10 理解Random的随机行为185

11.11 在函数命名中使用特殊字符187

11.12 告知Java处理异常188

 

●第12章 Spring框架191

12.1 开放用于继承的Spring管理的bean类191

12.2 持久化Kotlin数据类194

12.3 依赖注入196

 

●第13章 协程与结构化并发201

13.1 选择协程构建器201

13.2 使用withContext替换async/await207

13.3 使用协程调度器208

13.4 在Java线程池上运行协程210

13.5 取消协程213

13.6 协程调试216

上下滑动查看

 

本书没有专门针对Android的章节,相反,将全面讨论Kotlin在Android中的应用。一些与Android有关的特定内容(例如协程的取消),利用了Android库广泛使用Kotlin的事实,但一般来说,本书涵盖的语言特性可以在任何地方使用。本书希望以一种更通用的方式覆盖这门语言,使Android开发者能学到在开发任何项目时都有用的技巧。

 

直接入手

赠书福利

感谢机械工业张老师赠书《kotlin编程实战》5本,自己留一本,剩下 4 本赠送给大家。

参与方式

  1. 给本文一个双击:赞+在看

  2. 关注下面我的公众号

  3. 回复编程实战(建议复制)

????长按上方二维码 2 秒 

回复「编程实战」

为避免输错,建议复制

 ???? 点击抢先预览

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin 编程实战 的相关文章

  • select() 可以在 Windows 下使用 Python 中的文件吗?

    我正在尝试在 Windows 下运行以下 python 服务器 An echo server that uses select to handle multiple clients at a time Entering any line o
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • Pandas Dataframe:将包含列表的行扩展到多行,并为所有列提供所需的索引

    我在 pandas 数据框中有时间序列数据 索引为测量开始时的时间 列中包含以固定采样率记录的值列表 连续索引 列表中元素数量的差异 这是它的样子 Time A B Z 0 1 2 3 4 1 2 3 4 2 5 6 7 8 5 6 7 8
  • 如何在与应用程序初始化文件不同的文件中迭代 api 路由

    我有一个 apiroutes py 文件 其中定义了许多路由 例如 api route api read methods GET api route api write methods POST 其中 api 是导入 from import
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • Scipy 稀疏 Cumsum

    假设我有一个scipy sparse csr matrix代表下面的值 0 0 1 2 0 3 0 4 1 0 0 2 0 3 4 0 我想就地计算非零值的累积和 这会将数组更改为 0 0 1 3 0 6 0 10 1 0 0 3 0 6
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何在sphinx中启用数学?

    我在用sphinx http sphinx pocoo org index html与pngmath http sphinx pocoo org ext math html module sphinx ext pngmath扩展来记录我的代
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 检查字符串是否只有字母和空格 - Python

    试图让 python 返回一个字符串仅包含字母和空格 string input Enter a string if all x isalpha and x isspace for x in string print Only alphabe
  • 在 Python 模块中使用 InstaLoader

    我正在尝试使用 Instaloader 下载与主题标签相关的照片以进行图像分析 我在GitHub存储库中找到了一个全面的方法 如何在终端中执行它 但是 我需要将脚本集成到Python笔记本中 这是脚本 instaloader no vide
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器

随机推荐

  • el-select 结合 el-checkBox 实现下拉全选+多选功能

    实现效果如图所示 具体代码如下
  • RabbitMQ重复消费

    造成重复消费的原因 MQ向消费者推送message 消费者向MQ返回ack 告知所推送的消息消费成功 但是由于网络波动等原因 可能造成消费者向MQ返回的ack丢失 MQ长时间 一分钟 收不到ack 于是会向消费者再次推送该条message
  • 每日一题(day1)

    题目链接 方法一 使用栈进行中序遍历 class Solution public int kthSmallest TreeNode root int k stack
  • 决策树算法处理分类及回归问题的原理及python代码实现

    1 决策树原理介绍 通俗的理解 决策树就是对样本集根据某一个维度d和某一个阈值v进行二分 得到二叉树 即为决策树 通过样本训练计算出维度d和阈值v 即可对预测数据进行分类 如果对二叉树的各子节点value值求平均 将平均值赋予待分类样本 即
  • 疯壳-鸿蒙OS单板应用程序开发

    鸿蒙OS单板应用程序开发 疯壳 出品 a 在源码根目录下新建一个testapp的文件夹 在终端输入 mkdir testapp 指令新建一个名为testapp 的文件夹如下 b 进入testapp文件夹 新建一个名为my first app
  • 一个用于拷贝文件并判断是否拷贝成功的批处理文件

    echo off chcp 65001 copy E opencv build x64 vc15 bin opencv videoio ffmpeg420 64 dll windir set err ERRORLEVEL IF err 1
  • pear文件利用 (远程文件下载、生成配置文件、写配置文件) 从一道题看——CTFshow私教 web40

    web40 考点 pear文件包含 pear是PHP的一个扩展 条件 1 有文件包含点 2 开启了pear扩展 可以当他是一个框架 3 配置文件中register argc argv 设置为On 而默认为Off SERVER argv 生效
  • Vue脚手架的创建步骤

    vue cli脚手架 案例一 案例二 一 脚手架简介 Vue脚手架是Vue官方提供的标准化开发工具 开发平台 它提供命令行和UI界面 方便创建vue工程 配置第三方依赖 编译vue工程 1 webpack 前端项目工程化的标志之一就是引入了
  • Robot Arm 机械臂源码解析

    Robot Arm 机械臂源码解析 说明 Robot Arm是我复刻 也是玩的第一款机械臂 用的是三自由度的结构 你可以理解为了三个电机 三轴有自己的一些缺陷 相比于六轴机械臂而言因为结构的缺陷 不能达到空间内的一些点 这些点又叫做奇异点
  • Mybatis Plus入门

    MyBatis Plus介绍 MyBatis Plus 简称MP 是国内人员开发的 MyBatis 增强工具 在 MyBatis 的基础上只做增强不做改变 为简化开发 提高效率而生 特征 无侵入 Mybatis Plus 在 Mybatis
  • 过年不再被逼相亲——我用python给亲戚展示2022的相亲数据

    人生苦短 我用Python 这不是快过年了吗 又到了一年一度的亲戚大考验环节 没对象的他们会问你 找对象了吗 你要是学计算机专业的 他们会问你 会修电脑吗 出去学了点啥他们也会要求 才艺展示一下 我相信大家都躲不过去 既然躲不过去 那直接上
  • 主力吸筹猛攻指标源码_成功率90%以上【主力吸筹+买点提示+使用方法】通达信指标公式源码...

    成功率 90 以上 主力吸筹 买点提示 使用方法 使用方法 当指标出现红绿柱时就要开始关注 未来几天如果紫线上穿黄线 即是买点 紫 线穿过黄线的当天即可买入 此指标成功率极高 90 COLORBLUE VAR1 REF LOW OPEN C
  • 第6章 计算机的运算方法

    6 1无符号数和有符号数 6 1 1无符号数 寄存器位数反映无符号数的表示范围 6 1 2有符号数 1 机器数与真值 真值 带符号的数 机器数 符号数字化的数 2 原码表示法 整数 x 原是n 1位 用逗号将符号位和数值部分分隔开 小数 用
  • 6s微信连接不上服务器失败是什么原因,6s手机微信打不开怎么回事

    很多使用6s手机的用户反应 微信打不开一直显示正在载入怎么办 下面由学习啦小编为你整理了6s手机微信打不开怎么回事的相关方法 希望对你有帮助 6s手机微信打不开解决方法 如图所示 右下角的微信变成这样子 下方显示 正在载入 无法打开 我们首
  • Docker 安装 Nginx

    拉取镜像 docker pull nginx 启动测试 docker run d p 80 80 nginx p 80 80 端口进行映射 将本地 80 端口映射到容器内部的 80 端口 d nginx 设置容器在在后台一直运行 访问主机
  • c++ set容器

    容器分类 1 顺序容器 2 关联容器 3 无序 散列 容器 vector 向量 连续存储的元素 list 链表 由节点组成的双向链表 每个节点包含着一个元素 forward list 单向链表 deque 双队列 由连续存储的指向不同元素的
  • Qt: multiple definition of XXX

    使用Qt编译源文件时出现很多multiple definition of XXX的报错 可能原因是在多次包含global h时重复定义了变量和函数 但检查过代码后 发现并不存在重复定义的变量和函数 这时 只需要清除项目编译 o文件 重新构建
  • 【云原生之Docker实战】使用docker部署家庭DOS游戏服务器

    云原生之Docker实战 使用docker部署家庭DOS游戏服务器 一 DOS游戏网页版介绍 二 检查宿主机系统版本 三 检查本地docker环境 1 检查docker服务状态 2 检查docker版本 四 下载oldiy dosgame
  • C语言入门(基础二)

    延续上作 本篇博客带大家继续入门C语言 运算符 C语言三大结构 顺序结构 选择结构 循环语句 运算符 C语言为我们提供了很多的运算符 有单目运算符 双目运算符和三目运算符 这里的一目二目三目指的是操作的对象个数 我们可以使用这些运算符来解决
  • Kotlin 编程实战

    code小生 一个专注大前端领域的技术平台 公众号回复Android加入安卓技术群 导读 Kotlin诞生于2011年 开源于2012年 吸收了Java等语言的优良特性 提供了令人惊艳的编程体验 是编程语言界名副其实的 后浪 欢迎来到Kot