如果我有类似于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
。我试了几种方法都无济于事;有人用过这样的东西吗?
4条答案
按热度按时间7rtdyuoh1#
有一个身份function in Predef。
我想,A代表表达更好:
编辑:
我试图弄清楚为什么需要type参数(选项[字符串])。问题似乎出在从选项[T]到迭代[T]的类型转换上。
如果您将标识函数定义为:
可以省略type参数。
bkhjykvo2#
FWIW,在Scala2.8上只需调用
flatten
即可。Thomas在Scala 2.7中几乎涵盖了这一点。他只错过了使用这个身份的另一种方式:然而,它不能与运算符表示法一起工作(运算符表示法似乎不接受类型参数,这一点很好知道)。
您也可以在Scala2.7上*调用
flatten
(至少在List
上),但如果没有类型,它将无法执行任何操作。但是,这是可行的:aor9mmx13#
您只需给类型推断器一点帮助:
0ejtzxu14#
Scala 3: