Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 嵌套ifs的函数语法_Scala - Fatal编程技术网

Scala 嵌套ifs的函数语法

Scala 嵌套ifs的函数语法,scala,Scala,有时我会编写如下代码: val item1 = list.find(_.source.name.equals("foo")) if (item1.isDefined) doSomething1(item1) else { val item2 = list.find(_.dest.name.equals("bar")) if (item2.isDefined) doSomething2(item2) else doSomethingElse() } 有没有人有更好的Scala语法来编

有时我会编写如下代码:

val item1 = list.find(_.source.name.equals("foo"))
if (item1.isDefined) doSomething1(item1)
else {
  val item2 = list.find(_.dest.name.equals("bar"))
  if (item2.isDefined) doSomething2(item2)
  else doSomethingElse()
}

有没有人有更好的Scala语法来编写这段代码?

正如Kevin所说,如果这些是返回内容的表达式就更好了。我将和你做同样的事情,但用一个不同的具体例子:

val list = List(1,2,3,4)
val result = list.find(_ == 1).map(
  _ => "Found1").orElse(list.find(_ == 5).map(
    _ => "Found2")).getOrElse("Found3")
然而,你的可能看起来更好:)但要避免副作用。让
if/else
链或monad链成为一个表达式,它的计算结果是某种东西,而不是某种奇怪的副作用

list.find(_.source.name =="foo").fold(doSomething1) {
  list.find(_.dest.name == "bar").fold(doSomething2)(doSomethingElse)
}
但这是因为我将方法
fold
添加到
选项中,如下所示:

class FoldableOption[A](o: Option[A]) {
  def fold[Z](f: A => Z)(g: => Z) = o.map(f).getOrElse(g)
}
implicit def option_has_folds[A](o: Option[A]) = new FoldableOption(o)
如果不想添加
fold
方法,还可以使用
map
getOrElse
对:

list.find(_.source.name == "foo").map(doSomething1).getOrElse {
  list.find(_.dest.name == "bar").map(doSomething2).getOrElse(doSomethingElse)
}

这并不是很详细。

这应该可以,但速度会稍微慢一些:

val item1 = list find (_.source.name == "foo")
val item2 = list find (_.dest.name == "bar")
item1 map (doSomething1) orElse {
  item2 map (doSomething2)
} getOrElse doSomethingElse()
更新:效率更高,但不够整洁:

val item1 = list find (_.source.name == "foo")
item1 map (doSomething1) orElse {
  val item2 = list find (_.dest.name == "bar")
  item2 map (doSomething2)
} getOrElse doSomethingElse()

doSomethings是仅仅用于(副)效果,还是返回任何有意义的结果?这正是我要避免的(不管如何运行find两次)。选项的fold方法也在中实现。