74

如果我有类似 aList[Option[A]]并且想将其转换为 a List[A],则标准方法是使用flatMap

scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))

scala> l.flatMap( o => o)
res0: List[java.lang.String] = List(Hello, World)

现在o => o只是一个身份功能。我本以为会有一些方法可以做到:

l.flatMap(Identity) //return a List[String]

但是,我无法使其正常工作,因为您无法生成object. 我尝试了几件事无济于事;有没有人有这样的工作?

4

3 回答 3

70

Predef 中有一个恒等函数。

l flatMap identity[Option[String]]

> List[String] = List(Hello, World)

一个 for 表达式更好,我想:

for(x <- l; y <- x) yield y

编辑:

我试图弄清楚为什么需要类型参数 (Option[String])。问题似乎是从 Option[T] 到 Iterable[T] 的类型转换。

如果将恒等函数定义为:

l.flatMap( x => Option.option2Iterable(identity(x)))

类型参数可以省略。

于 2009-11-25T15:12:32.377 回答
23

FWIW,在 Scala 2.8flatten上,您只需调用它即可。Thomas主要涵盖了 Scala 2.7。他只是错过了使用该身份的另一种方式:

l.flatMap[String](identity)

但是,它不适用于运算符表示法(似乎运算符表示法不接受类型参数,这很高兴知道)。

您也可以调用flattenScala 2.7(List至少在 a 上),但如果没有类型,它将无法执行任何操作。但是,这有效:

l.flatten[String]
于 2009-11-25T18:19:44.137 回答
4

你可以给类型推断器一点帮助:

scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))

scala> l.flatten[String]
res0: List[String] = List(Hello, World)
于 2009-11-25T21:03:54.367 回答