2017-03-03 70 views
2
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 
    } 
} 

a,b,c,d的類型已被聲明只是爲了便於分析代碼。斯卡拉循環意外編譯錯誤

然後我得到了意外的編譯錯誤:

Error:(10, 15) type mismatch; 
found : List[Long] 
required: Option[?] 
     c: Long <- b 

類型的b是一個列表,我覺得c應該指的是在列表b

爲什麼編譯器預計b應該是每個項目選擇什麼?

回答

0

問題是你正在混合選項和列表。如果您將您的選項列表它的工作原理:

b: List[Long] <- map1.get(a).toList 

請記住,對於修真僅僅是flatMap語法糖。這實際上是對map1.get(a)結果進行flatMap

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)