用for-comprehension替换flatMap / map链

时间:2018-02-27 20:14:19

标签: scala for-comprehension

我试图对以下内容使用for-understanding:

val s: Seq[Option[Int]] = //...
val t: Option[Int] = //...

s.map(sv => t.flatMap(tv => sv.map(_ == tv))) 

我试过了:

val r: Seq[Option[Boolean]] = for(
  sv <- s;
  tv <- t;
  svv <- sv
) yield svv == tv //Seq[Boolean] does not conform to Seq[Option[Boolean]]

有没有办法用for-comprehension简洁地写作?

2 个答案:

答案 0 :(得分:5)

不鼓励在相同的理解范围内使用不同的集合(在这里难以使用M字),并且在一般情况下它不起作用。选项序列仅起作用,因为Scala为这种情况定义了一些隐式转换(因为它们很常见)。

最好使用两个单独的理解,一个用于序列,另一个用于选项。

val s: Seq[Option[Int]] = List(Some(1), None, Some(2))
val t: Option[Int] = Some(2)

val result = for {
  elem <- s
} yield for {
  evalue <- elem
  tvalue <- t
} yield evalue == tvalue

println(result) // List(Some(false), None, Some(true))

答案 1 :(得分:2)

我可能会混合使用它来保持简单和简短:

val r: Seq[Option[Boolean]] =
  for (
    opt <- s;
    v <- t
  ) yield opt.map(_ == v)