考虑以下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在使用可空/非nullabe类型时是否有内置机制来实现相同的目标?
我设法通过以下方式实现了这个效果:
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
是一个不可为空的字符串。)
所以,我的问题另一种说法是:Kotlin的标准库中是否已存在nullMap
等价物?和/或:有不同的标准方式吗?
最后,在Kotlin中可以实现视觉上更清晰的链接方法,而不是单独的分配(上面)或嵌套的函数调用吗?我认为您可以在nullMap
上添加Any
作为扩展方法,但有时您尝试调用方法的接收方为null
(因此不会工作)。
答案 0 :(得分:13)
我们使用safe call operator:
val foo: Foo? = ...
foo?.toA()?.toB()
或者
foo?.let(this::transform1)?.let(this::transform2)
Kotlin强调无效安全。其手册中有an entire chapter描述相关技术。