2014-06-05 172 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]]作为最终输出。