让我们假设你有两个可以归零的功能,你无法组成这两个功能:
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来实现这一点,还是可以使用?
运算符?
谢谢:)
答案 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