是否有一个阶身份的功能?
-
22-09-2019 - |
题
如果我有像一个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)
不隶属于 StackOverflow