我有以下方法,我希望通过在列表上执行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(_ ++ _)
}
当列表为空时,它会抛出一个停止执行的异常。解决这个问题的最佳方法是什么?
答案 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()