有一个斯卡拉身份识别function吗?

如果我有一个像List[Option[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 。 我尝试了一些东西没有用。 有没有人有这样的工作?

Predef中有一个身份识别function 。

 l flatMap identity[Option[String]] > List[String] = List(Hello, World) 

一个expression更好,我想:

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

编辑:

我试图找出为什么需要types参数(Option [String])。 问题似乎是从Option [T]到Iterable [T]的types转换。

如果您将身份函数定义为:

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

types参数可以省略。

FWIW,在Scala 2.8上,你可以称之为flatten 。 托马斯它主要覆盖斯卡拉2.7。 他只错过了使用这种身份的另一种方式:

 l.flatMap[String](identity) 

它不会用操作符表示法,但是(看来操作符表示法不接受types参数,这是很好的知道)。

你也可以在Scala 2.7上调用flatten (至less在List上),但是如果没有types,它将无法做任何事情。 但是,这工作:

 l.flatten[String] 

你可以给types推理一点帮助:

 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)