Kotlin相当于Optional.map和一个方法的引用
Java
考虑下面的Java:
private void example() { Optional<String> foo = ... Optional<String> bar = foo.map(this::transform1) .map(this::transform2) } private String transform1(String s) { return s + "!"; } private String transform2(String s) { return "@" + s; }
请注意, transform
方法接受非可选值。
题
Kotlin在使用可空或非空类型时是否有内置机制来实现相同的功能?
第一次尝试
我设法达到这个效果如下:
fun <A, B> nullMap(a: A?, mapper: (a: A) -> B?): B? = if (a != null) mapper.invoke(a) else null fun example() { val foo: String? = "Space cookies" val bar1: String? = nullMap(foo, Example::transform1) val bar2: String? = nullMap(bar1, Example::transform2) } fun transform(s: String) = s + "!" fun transform2(s: String) = "@" + s
(再一次,我们注意到,对于transform
方法, s
是一个不可空的String。)
所以,我的问题另一种说法是:在Kotlin的标准库中是否已经存在一个nullMap
等价物? 和/或:有没有一个不同的标准方式做到这一点?
最后,可以在Kotlin中实现视觉更清晰的链接方法,而不是单独的分配(上面)或嵌套的函数调用? 有一段时间我认为你可以在Any
上添加nullMap
作为扩展方法,但是有时你试图调用一个方法的接收者是null
(所以这是行不通的)。
我们使用安全呼叫运营商 :
val foo: Foo? = ... foo?.toA()?.toB()
要么
foo?.let(this::transform1)?.let(this::transform2)
Kotlin强调零安全。 手册中有一整章介绍相关技术。