【问题标题】:Does Scala have an API method that converts a Seq[Option[T]] to Seq[T]?Scala 是否有将 Seq[Option[T]] 转换为 Seq[T] 的 API 方法?
【发布时间】:2011-04-04 01:59:07
【问题描述】:

是否有转换 Seq[Option[T]] -> Seq[T] 的 Scala API 方法?

您可以通过以下方式手动执行此操作:

seq.filter(_.isDefined).map(_.get)

想知道通用API中是否有实现上述功能的方法。

【问题讨论】:

  • filter + map 可以简化为以偏函数为参数的collect

标签: scala option


【解决方案1】:

绝对,绝对不是。 (不是!)

scala> val so1 = List(Some(1), None, Some(2), None, Some(3))
so1: List[Option[Int]] = List(Some(1), None, Some(2), None, Some(3))

scala> so1.flatten
res0: List[Int] = List(1, 2, 3)

【讨论】:

  • 令人惊讶的是 so1.flapMap(r => r) 也有效。这似乎是因为 Option 可以通过以下方式转换为可迭代对象:implicit def option2Iterable[A](xo: Option[A]): Iterable[A] = xo.toList。当 xo.toList 被调用时,只有 Some(X) 生成一个列表值。没有给出一个 List()。 Flatmap 完成了剩下的工作。
  • 并不奇怪,因为flatMap(fun) == map(fun).flatten
  • 你所说的“绝对,肯定不是。(不是!)”你的代码演示这不起作用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 2018-08-20
  • 2019-03-03
  • 1970-01-01
相关资源
最近更新 更多