用 for-comprehension 替换 flatMap/map 链
Replace flatMap/map chain with for-comprehension
我正在尝试对以下内容使用 for-comprehension:
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
写得简洁些?
在同一个 for-comprehension 中使用不同的集合(这里很难抗拒使用 M-word)无论如何都是不鼓励的,而且在一般情况下它不会起作用。选项序列之所以有效,是因为 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))
我可能会混合一些东西以保持简单和简短:
val r: Seq[Option[Boolean]] =
for (
opt <- s;
v <- t
) yield opt.map(_ == v)
我正在尝试对以下内容使用 for-comprehension:
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
写得简洁些?
在同一个 for-comprehension 中使用不同的集合(这里很难抗拒使用 M-word)无论如何都是不鼓励的,而且在一般情况下它不会起作用。选项序列之所以有效,是因为 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))
我可能会混合一些东西以保持简单和简短:
val r: Seq[Option[Boolean]] =
for (
opt <- s;
v <- t
) yield opt.map(_ == v)