abort
声明a,b,c,d的类型只是为了便于分析代码。
然后我收到意外的编译错误:
object Main {
val list = List[Long]()
val map1 = Map[Long, List[Long]]()
val map2 = Map[Long, Long]()
def main(args: Array[String]): Unit = {
for {
a: Long <- list
b: List[Long] <- map1.get(a)
c: Long <- b
d: Long <- map2.get(c)
} yield d
}
}
Error:(10, 15) type mismatch;
found : List[Long]
required: Option[?]
c: Long <- b
的类型是一个列表,我认为b
应该表示列表中的每个项目c
为什么编译器期望b
应该是Option?
答案 0 :(得分:0)
问题是您正在将选项与列表混合。如果您将选项转换为List,则可以使用:
flatMap
请记住,理解只是flatMap
的语法糖。这实际上是对map1.get(a)
:
b: List[Long] <- map1.get(a)
c: Long <- b
List
预计会有一个选项。为避免混淆,您应始终使用与开始时相同的类型,在这种情况下为b
。
另一种选择是完全跳过a: Long <- list
c: Long <- map1.get(a).toList.flatten
d: Long <- map2.get(c)
并直接展平第一张地图的结果:
find_all_anagrams(f)