将选项链接在一起的模式

Kat*_*Kat 3 scala

我发现我经常需要链接在一起工作的函数Option并返回不同的函数,Option如下所示:

if(foo.isDefined) someFunctionReturningOption(foo.get) else None
Run Code Online (Sandbox Code Playgroud)

有更清洁的方法吗?对于更复杂的变量,这种模式变得非常冗长.

我在表单处理代码中看到了一些必须处理可选数据的问题.None如果值是None或某些转换(可能会失败),它将插入,如果有一些值.

这非常类似于为C#提出?.运营商.

Mic*_*jac 6

你可以使用flatMap:

foo.flatMap(someFunctionReturningOption(_))
Run Code Online (Sandbox Code Playgroud)

或者在理解中:

for {
    f <- foo
    r <- someFunctionReturningOption(f)
} yield r
Run Code Online (Sandbox Code Playgroud)

将这些函数的多个实例链接在一起时,首选for-comprehension,因为它们会降低flatMaps.