首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将flatMap/map chain替换为for-comprehension

将flatMap/map chain替换为for-comprehension
EN

Stack Overflow用户
提问于 2018-02-28 04:14:19
回答 2查看 1.2K关注 0票数 3

我正在尝试使用for-comprehension来处理以下内容:

代码语言:javascript
复制
val s: Seq[Option[Int]] = //...
val t: Option[Int] = //...

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

我试过这个:

代码语言:javascript
复制
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简洁地编写代码的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-28 04:41:57

无论如何都不鼓励在同一个for-comprehension中使用不同的集合(这里很难拒绝使用M-word ),而且它在一般情况下不会起作用。只有在Scala为这种情况定义了一些隐式转换(因为它们非常常见)的情况下,选项序列才会起作用。

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

代码语言:javascript
复制
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))
票数 9
EN

Stack Overflow用户

发布于 2018-02-28 04:48:24

我可能会混合一些东西来保持它的简单和简短:

代码语言:javascript
复制
val r: Seq[Option[Boolean]] =
  for (
    opt <- s;
    v <- t
  ) yield opt.map(_ == v)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49017189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档