Option 与 Nullable:如何选择
比较 Arrow 的 Option 类型与 Kotlin 可空类型,并做出恰当选择。
Option 与 Nullable:如何选择 是 CoddyKit 上的免费 Kotlin Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kotlin Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kotlin Academy 课程共包含 4 节课。
表示缺失值的两种方式
Kotlin 可空类型
Kotlin 的 T? 是大多数 Kotlin 代码中表示缺失值的惯用选择。编译器会强制执行空值检查,安全调用运算符 ?. 可以平滑地串联调用,而 ?: "default" 可以简洁地提供回退值:
val name: String? = findUser(id)?.name
val display = name ?: "Anonymous"Arrow 的 Option<A>
import arrow.core.Option
import arrow.core.Some
import arrow.core.None
import arrow.core.toOption
val opt: Option<String> = "hello".toOption() // Some("hello")
val absent: Option<String> = None在 Option 与可空类型之间转换
您可以自由转换:value?.toOption() 会将可空值封装为 Option;option.getOrNull() 会提取值或返回 null;option.getOrElse { default } 会提供回退值:
val opt: Option<String> = nullableString.toOption()
val back: String? = opt.getOrNull()Option 上的 map 和 flatMap
map { } 会转换 Some 值(None 保持不变)。flatMap { } 会串联自身返回 Option 的操作:
val length: Option<Int> = "hello".toOption().map { it.length } // Some(5)
val noneLength: Option<Int> = (null as String?).toOption().map { it.length } // NoneOption 上的 filter
如果谓词为假,filter { predicate } 会将 Some 转换为 None:
val positiveAge: Option<Int> = 25.toOption().filter { it > 0 } // Some(25)
val rejectedAge: Option<Int> = (-1).toOption().filter { it > 0 } // Nonefold:消费 Option
fold(ifEmpty, ifSome) 无需模式匹配,即可在一个表达式中处理两种情况:
val result: String = someOption.fold(
ifEmpty = { "Nothing here" },
ifSome = { value -> "Got: $value" }
)何时优先使用可空类型 T?
以下情况优先使用 Kotlin 可空类型(T?):
- 您正在编写其他人会阅读的惯用 Kotlin 代码
- 您需要空值安全的运算符链(
?.、?:) - 该类型用于不使用 Arrow 的接口
- 性能至关重要(没有装箱开销)
何时优先使用 Option<A>
以下情况优先使用 Option:
- 您已经在使用 Arrow 的函数式流水线(
map、flatMap) - 您希望将可选值与
Either或Raise组合 - 您希望在通用函数式上下文中明确表示缺失值
- 您正在构建一个调用方可能不使用 Kotlin 的库
either { } 内的 Option
在 Arrow 的 either { } 代码块中,可以先将 Option 转换为 Either,然后对其调用 .bind():
fun findUserOpt(id: Long): Option<User> = TODO()
fun getUser(id: Long): Either<UserError, User> = either {
findUserOpt(id)
.toEither { UserError.NotFound }
.bind()
}选项类型反模式
不要仅仅因为 Option 存在,就到处使用选项类型。在 Kotlin 中,大多数应用程序代码里,String? 比 Option 更清晰。只有在其函数式运算符确实能带来价值时,才使用 Option。
快速检查
在 Arrow 的选项类型中,None.map { it.length } 会返回什么?
回顾:选项类型与可空类型
常见问题解答
「Option 与 Nullable:如何选择」课时是免费的吗?
是的 — 「Option 与 Nullable:如何选择」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kotlin Academy 课程的其余内容,请升级到 CoddyKit PRO。 Kotlin Academy 课程共包含 4 节课。
「Option 与 Nullable:如何选择」这节课中我会学到什么?
比较 Arrow 的 Option 类型与 Kotlin 可空类型,并做出恰当选择。 你通过在浏览器中直接运行的动手代码来练习 Kotlin Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Kotlin Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Kotlin Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「Option 与 Nullable:如何选择」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Kotlin Academy 课中编写并运行代码吗?
能。每节 Kotlin Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Either :无需异常的类型化错误处理
- Arrow Raise DSL:组合类型化错误
- Option 与 Nullable:如何选择
- 使用 Arrow 核心类型进行函数式领域建模