了解如何返回list.reduceLeft

时间:2012-03-10 06:02:23

标签: scala

我有以下方法,我希望通过在列表上执行reduceLeft来返回地图。我的问题是偶尔列表是空的,所以我不确定正确的处理方法:

  def results(start: String, end: String) = {
    val iter = new QueryIterator(RK, start, end);

    val list = for (hcol <- iter) yield (Map(hcol.getValue() -> 
        Map(hcol.getName()) -> hcol.getTime()))))
    list.reduceLeft(_ ++ _)
  }

当列表为空时,它会抛出一个停止执行的异常。解决这个问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:7)

您可以改为使用foldLeft,并以要返回的类型的空地图开头,例如

list.foldLeft(Map.empty[Int,(String,Float)])(_ ++ _)

(确保您正确匹配地图的类型;我猜测getValue()会返回Int等等。)

答案 1 :(得分:1)

如果那令人困惑,你可以做命令式的风格(但不要告诉任何我告诉过你的人)

var m = Map[Int,(String,Float)]()
new QueryIterator(RK, start, end) foreach { hcol => 
  m += Map(hcol.getValue -> Map(hcol.getName -> hcol.getTime)) 
}
m

答案 2 :(得分:0)

您可以使用Scalaz中的.sum方法。

import scalaz._
import Scalaz._

scala> List(Map(1 -> 2, 3 -> 4), Map(4 -> 11)).asMA.sum
res21: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2, 3 -> 4, 4 -> 11)

scala> (Nil : List[Map[Int, Int]]).asMA.sum
res22: Map[Int,Int] = Map()