 Reactor - 对 Kotlin 的支持
Reactor - 对 Kotlin 的支持
  # 简介
Kotlin (opens new window) 是一种运行于 JVM(及其他平台)上的静态(statically-typed)语言。 使用它可以在拥有与现有 Java 库良好 互操作性 (opens new window) 的同时编写简介优雅的代码。
本内容介绍了 Reactor 3.1 如何能够完美支持 Kotlin。
# 前提
Kotlin 支持 Kotlin 1.1+ 及依赖 kotlin-stdlib (opens new window) (或 kotlin-stdlib-jre7 (opens new window) / kotlin-stdlib-jre8 (opens new window) 之一)
# 扩展
多亏了其良好的 Java 互操作性 (opens new window) 以及 Kotlin 扩展(extensions) (opens new window), Reactor Kotlin APIs 既可使用 Java APIs,还能够收益于一些 Reactor 内置的专门支持 Kotlin 的 APIs。
注意 Kotlin 的扩展需要 import 才能够使用。所以比如
Throwable.toFlux的 Kotlin 扩展必须在import reactor.core.publisher.toFlux后才可使用。多数场景下 IDE 应该能够自动给出这种类似 static import 的建议。
例如,Kotlin 参数类型推导(reified type parameters) (opens new window) 对于 JVM 的 通用类型擦除(generics type erasure) (opens new window)提供了一种变通解决方案,Reactor 就可以通过扩展(extension)来应用到这种特性。
下面是对「Reactor with Java」和「Reactor with Kotlin + extensions」的比较:
| Java | Kotlin + extensions | 
|---|---|
| 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>()orflux.ofType(Foo::class) | 
| StepVerifier.create(flux).verifyComplete() | flux.test().verifyComplete() | 
可参考 Reactor KDoc API (opens new window) 中详细的关于 Kotlin 扩展的文档。
# Null 值安全
Kotlin的一个关键特性就是 null 值安全 (opens new window) ——从而可以在编译时处理 null 值,而不是在运行时抛出著名的 NullPointerException。 这样,通过「可能为空(nullability)」的声明,以及能够表明「有值或空值」的语法(避免使用类似 Optional 来进行包装),使得应用程序更加安全。(Kotlin允许在函数参数中使用可能为空的值, 请参考 comprehensive guide to Kotlin null-safety (opens new window))
尽管 Java 的类型系统不允许这样的 null 值安全的表达方式, Reactor 空值安全 对所有 Reactor API 通过工具友好的(tooling-friendly)注解(在 reactor.util.annotation 包中定义)来支持。 默认情况下,Java APIs 用于 Kotlin 的话会被作为 平台类型(platform types) (opens new window) 而放松对 null 的检查。 Kotlin 对 JSR 305 注解的支持 (opens new window) + Reactor 可为空(nullability)的注解,为所有 Reactor API 和 Kotlin 开发者确保「null 值安全」的特性 (在编译期处理 null 值)。
JSR 305 的检查可以通过增加 -Xjsr305 编译参数进行配置:-Xjsr305={strict|warn|ignore}。
对于 kotlin 1.1.50+,默认的配置为 -Xjsr305=warn。如果希望 Reactor API 能够全面支持 null 值安全 则需要配置为 strict。不过你可以认为这是实验性的(experimental),因为 Reactor API 「可能为空」 的声明可能甚至在小版本的发布中都会不断改进,而且将来也可能增加新的检查。
目前尚不支持通用类型参数、可变类型以及数组元素的「可为空」。不过应该包含在接下来的发布中,最新信息请看 这个 Issues (opens new window)。
