如果我有像一个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 功能的身份

l flatMap identity[Option[String]]

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

一个用于expresion是更好的,我想:

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

修改

我试图找出为什么需要该类型参数(选项[字符串])。这个问题似乎是从选项类型转换[T],以可迭代[T]。

如果定义恒等函数为:

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

类型参数可以省略。

其他提示

FWIW,斯卡拉2.8你只需要调用它flatten托马斯有它主要涵盖斯卡拉2.7。他只错过使用身份的一个替代的方法:

l.flatMap[String](identity)

它将不会与运营商的符号的工作,但(似乎算符不接受类型的参数,这是很好的了解)。

您可以的斯卡拉上调用2.7 flatten(上List,至少),但它不能做任何事情没有一个类型。然而,这种工作:

l.flatten[String]

您可以只给类型inferencer一点帮助:

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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top