中级教程: 扩展函数
在这一章中, 你将探索一些特殊的 Kotlin 函数, 它们能够让你的代码更加简洁, 更加易读. 学习这些函数能够如何帮助你使用高效的设计模式, 将你的项目提升到更高水平.
扩展函数
在软件开发中, 你经常需要修改一个程序的行为, 但又不能修改原来的源代码. 例如, 在你的项目中, 你可能想要向一个来自第三方库的类添加额外的功能.
扩展函数让你能够向一个类扩展额外的功能. 你可以通过调用一个类的成员函数同样的方式来调用扩展函数.
在介绍扩展函数的语法之前, 你需要理解术语 接受者类型(Receiver Type) 和 接受者对象(Receiver Object).
接受者对象(Receiver Object)是指函数对哪个对象调用. 换句话说, 接受者就是共享信息的来源.

在这个示例中, main()
函数调用 .first()
函数. .first()
函数 对 readOnlyShapes
变量调用, 因此 readOnlyShapes
变量就是接受者.
接受者对象有 类型, 因此编译器能够知道函数在什么时候能够使用.
这个示例使用标准库的 .first()
函数来返回列表中的第一个元素. 要创建你自己的扩展函数, 请写下你想要扩展的类名称, 之后是一个 .
号, 之后是你的函数名称. 后面是函数声明的其余部分, 包括它的参数和返回类型.
例如:
在这个示例中:
String
是被扩展的类, 也叫做接受者类型.bold
是扩展函数的名称..bold()
扩展函数的返回类型是String
."hello"
, 一个String
实例, 是接受者对象.在函数的 body 部, 访问接受者对象时使用了 关键字:
this
.使用了字符串模板 (
$
) 来访问this
的值..bold()
扩展函数接受一个字符串, 并将它包含在<b>
HTML 元素内返回, 用于显示粗体文字.
面向扩展的设计
你可以在任何地方定义扩展函数, 因此可以创建面向扩展的设计. 这样的设计将核心功能与便利但并非必须的功能分离开, 让你的代码易于阅读和维护.
一个很好的例子是 Ktor 库的 HttpClient
类, 它帮助你执行网络请求. 它的核心功能是单个函数 request()
, 它的参数是一个 HTTP 请求需要的所有信息 :
在实际运用中, 最常用的 HTTP 请求是 GET 或 POST 请求. 库为这些常见的使用场景提供更短的名称是很合理的. 但是, 不需要编写新的网络代码, 只需要特定的请求调用. 换句话说, 这些请求很适用定义为单独的 .get()
和 .post()
扩展函数:
这些 .get()
和 .post()
函数使用正确的 HTTP 方法调用 request()
函数, 因此你就不必自己调用了. 这些函数简化了你的代码, 让代码更加易于理解:
在 Kotlin 的 标准库 和其他库中, 大量使用了这种面向扩展的方案. 例如, String
类有很多 扩展函数 帮助你处理字符串.
关于扩展函数, 详情请参见 扩展.
实际练习
习题 1
编写一个扩展函数, 名为 isPositive
, 接受一个整数参数, 判断它是不是正数.
习题 2
编写一个扩展函数, 名为 toLowercaseString
, 接受一个字符串参数, 返回它的小写形式.
- 提示
使用
String
类型的.lowercase()
函数.