将Scala foreach转换为.map

时间:2014-06-05 19:32:48

标签: scala syntax map foreach seq

我是Scala的新手,我正在尝试转换格式的代码

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(...)
})

但这不编译,因为(我相信)映射序列作为单个Seq [Any]而不是Seq [Seq [Any]]附加,所以我得到错误

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

有什么想法吗?语法有问题吗?

1 个答案:

答案 0 :(得分: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]]作为最终输出。