Mar*_*rco 4 if-statement scala
我有一系列验证函数,如果有的话,返回Option [Problem],如果没有找到验证问题,则返回None.我想编写一个调用每个验证函数的简单函数,停止并返回第一个not-None结果.
当然我可以在"java风格"中编写这个方法,但我想知道是否存在更好的方法.
编辑
这是最初的Java解决方案:
validate01(arg);
validate02(arg);
validate03(arg);
...
Run Code Online (Sandbox Code Playgroud)
如果出现问题,每种方法都会抛出异常.在我写Scala的时候,我会远离异常.
举个例子,假设我们要验证一个String.我们的验证功能需要String验证,这是从功能和一个清单String来Option[Problem].我们可以以这样的功能方式实现它:
def firstProblem(validators: List[String => Option[Problem]], s:String) =
validators.view.flatMap(_(s)).headOption
Run Code Online (Sandbox Code Playgroud)
这会通过将每个验证函数应用于字符串并仅在结果为a时保留结果来创建新列表Some.然后我们采用此列表的第一个元素.由于调用view,列表将仅在需要时计算.因此,只要找到第一个问题,就不会再调用其他验证器.
如果您在编译时具有有限且已知的验证数,则可以在选项上使用.orElse:
def foo(x: Int): Option[Problem] = ...
def bar(x: Int): Option[Problem] = ...
...
def baz(x: Int): Option[Problem] = ...
foo(1) orElse bar(2) orElse .. baz(n)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1019 次 |
| 最近记录: |