2014-06-05 95 views
1

我是新來斯卡拉,我嘗試轉換形式轉換斯卡拉的foreach到.MAP

val series: ListBuffer[Seq[Seq[Any]]] = ListBuffer[Seq[Seq[Any]]]() 
points.foreach(point => { 
    if(conditionA) 
     series += doA(...) // returns a ListBuffer[Seq[Any]] 
    else 
     series += doB(...) // returns a ListBuffer[Seq[Any]] 
}) 

的代碼中使用.MAP()。我想它是這樣的:

val series: ListBuffer[Seq[Seq[Any]]] = points.map(point => { 
    case conditionA => doA(...) 
    case _ => doB(...) 
}) 

但這並不能編譯,因爲(我相信)映射序列獲得附加爲一個序列[任何],而不是序列[序列[任何],所以我得到錯誤

Expression of type Seq[Any] doesn't conform to expected type ListBuffer[Seq[Seq[Any]]] 

任何想法?語法有問題嗎?

+0

doA和doB副作用? –

+0

不,他們只是以這種方式修改點以返回特定類型的Seq – mathematician

回答

3

讓我假設一些事情,你有一些函數def doA(arg1: A): ListBuffer[Seq[Any]],這樣你最終想要在映射此函數到你的集合之後到達List[Seq[Any]]作爲最終結果類型。然後,你要的是flatMap而不是map

val series = points flatMap{ 
    case point if conditionA(point) => doA(point) result() 
    case point => doB(point) result() 
} 

我做出這樣的假設是,你會永遠想在一般形式使用ListBuffer[A]的唯一理由是通過一些側面來創建一個List[A]原因 - 影響表達。因此,您最終需要一個List[Seq[A]]作爲最終輸出。