Kotlin相当于Optional.map和方法引用

Gre*_*pff 4 kotlin

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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,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
Run Code Online (Sandbox Code Playgroud)

(同样,我们注意到对于transform方法,s是一个不可为空的字符串.)

所以,我的问题另一种说法是:nullMapKotlin的标准库中是否已存在等价物?和/或:有不同的标准方式吗?

最后,可以在Kotlin中实现视觉上更清晰的链接方法,而不是单独的分配(上面)或嵌套的函数调用吗?有一会儿,我认为你可以添加nullMap一个扩展方法Any,但有时你试图调用一个方法的接收器是null(所以这将无法工作).

gle*_*e8e 13

我们使用安全呼叫运营商:

val foo: Foo? = ...
foo?.toA()?.toB()
Run Code Online (Sandbox Code Playgroud)

要么

foo?.let(this::transform1)?.let(this::transform2)
Run Code Online (Sandbox Code Playgroud)

Kotlin强调无效安全.其手册中有一整章描述了相关技术.