Понимание того, как вернуть list.reduceLeft - PullRequest
1 голос
/ 10 марта 2012

У меня есть следующий метод, где я хочу вернуть карту, выполнив 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 ]

7 голосов
/ 10 марта 2012

Вместо этого можно использовать foldLeft и начать с пустой карты того типа, который вы хотите вернуть, например,

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

(Убедитесь, что вы правильно соответствуете типу карты; я предполагаю, что getValue() возвращает Int и т. Д.)

1 голос
/ 10 марта 2012

Если это сбивает с толку, вы можете сделать это непременно, но не говорите никому, что я вам говорил

var m = Map[Int,(String,Float)]()
new QueryIterator(RK, start, end) foreach { hcol => 
  m += Map(hcol.getValue -> Map(hcol.getName -> hcol.getTime)) 
}
m
0 голосов
/ 10 марта 2012

Вы можете использовать .sum метод из Scalaz.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...