如何在Kotlin中构成nullables

时间:2016-05-16 14:04:18

标签: nullable kotlin

让我们假设你有两个可以归零的功能,你无法组成这两个功能:

fun giveInt(x: Int):Int? = x+1
fun giveInt2(x: Int):Int? = x+2

为了实现构图,我写了这个函数:

fun all(x:Int):Int? {
  val y = giveInt(x)
  if (y != null) return giveInt2(y) else return null;
}

val four = all(1)

是否可以在不明确写if (y != null)return null的情况下组合2个可空值来获取另一个可空值?

在Scala中我会做类似的事情:

def giveInt(x: Int):Option[Int] = Some(x+1)
def giveInt2(x: Int):Option[Int] = Some(x+2)
def all(x:Int): Option[Int] = giveInt(x).flatMap(giveInt2)

我应该使用java Optional来实现这一点,还是可以使用?运算符?

谢谢:)

3 个答案:

答案 0 :(得分:6)

可以使用safe call ?.运算符和let函数组合,如下所示:

fun giveInt(x: Int):Int? = x+1
fun giveInt2(x: Int):Int? = x+2

fun all(x: Int): Int? = giveInt(x)?.let { giveInt2(it) }

对于更多这样的习语,请使用this link

答案 1 :(得分:3)

如果你想要从字面上构成两个函数(在FP意义上),那么最好使用函数引用来提高可读性:

fun giveInt(x: Int):Int? = x+1
fun giveInt2(x: Int):Int? = x+2

fun all(x: Int): Int? = giveInt(x)?.let(::giveInt2)

答案 2 :(得分:0)

当您只有两个可空值时,voddan 的答案是可以的,但在许多可空值或复杂用例中不能很好地扩展。对于这些情况,存在处理多个可空值的 Konad 库,如下所示:

val foo: Int? = 1
val bar: String? = "2"
val baz: Float? = 3.0f

fun useThem(x: Int, y: String, z: Float): Int = x + y.toInt() + z.toInt()

val result: Int? = ::useThem.curry() 
   .on(foo.maybe) 
   .on(bar.maybe) 
   .on(baz.maybe)
   .nullable

如果你想保持它可以为空,或者

val result: Result<Int> = ::useThem.curry() 
   .on(foo.ifNull("Foo should not be null")) 
   .on(bar.ifNull("Bar should not be null")) 
   .on(baz.ifNull("Baz should not be null"))
   .result

如果你想累积错误。见maybe section