跳到主要内容

Kotlin 支持

Doubao 中英对照 Kotlin support

目录

Kotlin 是一门面向 JVM(及其他平台)的静态类型语言,它能够编写简洁而优雅的代码,同时与现有的 Java 库保持非常好的互操作性。

本节介绍 Reactor 对 Kotlin 的支持。

1. 要求​

Reactor 支持 Kotlin 1.1+,并依赖 kotlin-stdlib(或其 kotlin-stdlib-jdk7、kotlin-stdlib-jdk8 变体之一)。

2. 扩展​

注意

自 Dysprosium-M1(即 reactor-core 3.3.0.M1)起,Kotlin 扩展被迁移到一个专门的 reactor-kotlin-extensions 模块中,其新包名以 reactor.kotlin 开头,而不再是简单的 reactor。

因此,reactor-core 模块中的 Kotlin 扩展已被弃用。新依赖的 groupId 与 artifactId 为:

io.projectreactor.kotlin:reactor-kotlin-extensions

得益于其出色的 Java 互操作性以及 Kotlin 扩展,Reactor Kotlin API 在常规 Java API 的基础上,还额外增强了一些 Kotlin 专属 API,这些 API 在 Reactor 构件中开箱即用。

备注

请记住,Kotlin 扩展需要导入后才能使用。例如,Throwable.toFlux Kotlin 扩展只有在导入 import reactor.kotlin.core.publisher.toFlux 之后才可用。不过,与静态导入类似,在大多数情况下 IDE 应该会自动建议该导入。

例如,Kotlin 具体化类型参数为 JVM 的泛型类型擦除提供了一种变通方案,而 Reactor 提供了一些扩展来利用这一特性。

下表对比了 Reactor 搭配 Java 与 Reactor 搭配 Kotlin 及扩展的写法:

Java带扩展的 Kotlin
Mono.just("foo")"foo".toMono()
Flux.fromIterable(list)list.toFlux()
Mono.error(new RuntimeException())RuntimeException().toMono()
Flux.error(new RuntimeException())RuntimeException().toFlux()
flux.ofType(Foo.class)flux.ofType<Foo>() 或 flux.ofType(Foo::class)
StepVerifier.create(flux).verifyComplete()flux.test().verifyComplete()

Reactor KDoc API 列出并记录了所有可用的 Kotlin 扩展。

3. 空安全​

Kotlin 的关键特性之一是空安全,它在编译期干净地处理 null 值,而不是在运行期撞上著名的 NullPointerException。这使得应用程序通过可空性声明和富有表现力的「有值或无值」语义变得更加安全,而无需付出 Optional 这类包装器的代价。(Kotlin 允许对可空值使用函数式构造。请参阅这份全面的 Kotlin 空安全指南。)

尽管 Java 的类型系统无法表达空安全,但 Reactor 通过在 reactor.util.annotation 包中声明的、对工具友好的注解,如今为整个 Reactor API 提供了空安全。默认情况下,在 Kotlin 中使用的 Java API 类型会被识别为平台类型,对其的空值检查会被放宽。Kotlin 对 JSR 305 注解的支持与 Reactor 可空性注解一起,为 Kotlin 开发者提供了整个 Reactor API 的空安全,其优势在于可以在编译期处理与 null 相关的问题。

您可以通过添加 -Xjsr305 编译器标志并指定以下选项来配置 JSR 305 检查:-Xjsr305={strict|warn|ignore}。

对于 kotlin 1.1.50+ 版本,默认行为与 -Xjsr305=warn 相同。要让 Reactor API 实现完整的空安全,需要使用 strict 值,但该值应被视为实验性的,因为 Reactor API 的可空性声明即使在小版本之间也可能演进(未来可能会加入更多检查)。

备注

泛型类型参数、可变参数和数组元素的可空性尚不支持,但在即将发布的版本中应该会提供。请参阅此讨论获取最新信息。