我为什么要写
val flat: List[Int] = List(Some(1), Some(2)).flatMap(i => i)
但不是
val flat: List[Int] = List(Some(1), Some(2)).flatMap(_)
答案 0 :(得分:7)
下划线是变量的占位符。它本身并不是一种功能。 flatMap
需要一个功能。
此外,在这种情况下,有一个flatten
方法在List
上定义,Option
在Predef
内有一个隐式转换,这样你就可以&# 39;写完可以简化为那个电话,List(Some(1)).flatten
答案 1 :(得分:2)
下划线List(Some(1), Some(2)).flatMap(_)
的规则是x => List(Some(1), Some(2)).flatMap(x)
的缩写,而不是List(Some(1), Some(2)).flatMap(x => x)
。
答案 2 :(得分:0)
简短的回答是下划线可以引用身份映射,例如x => x
,但 flatMap
需要映射到TraversableOnce[U]
,例如项目列表。
例如,List(1, 2).flatMap(Seq(_))
有效。 List(1, 2).map(_ + 2)
也有效。第一个是身份映射,第二个将返回List(3, 4)
。
但是,如果在flatMap
map
(多个运算符)中进行了复杂的转换,则必须正确编写lambda函数,否则编译器无法正确推断该类型。请参阅Scala unexpectedly not being able to ascertain type for expanded function。