Kotlin 支持
目录
本节介绍 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
请记住,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 的可空性声明即使在小版本之间也可能演进(未来可能会加入更多检查)。
泛型类型参数、可变参数和数组元素的可空性尚不支持,但在即将发布的版本中应该会提供。请参阅此讨论获取最新信息。