Scala для понимания возврата упорядоченной карты - PullRequest
3 голосов
/ 30 сентября 2010

Как я могу использовать для понимания, которое возвращает то, что я могу назначить для упорядоченной карты? Это упрощение кода, который у меня есть:

class Bar
class Foo(val name: String, val bar: Bar)
val myList: java.util.List[Foo] = ...
val result: ListMap[String, Bar] =
    for {
        foo <- myList
    } yield (foo.name, foo.bar)

Мне нужно убедиться, что мой результат - это упорядоченная Карта, в которой кортежи возвращаются из-за понимания.

С вышеизложенным я получаю ошибку:

error: type mismatch;
found   : scala.collection.mutable.Buffer[(String,Bar)]
required: scala.collection.immutable.ListMap[String,Bar]
foo <- myList

Это компилируется:

class Bar
class Foo(val name: String, val bar: Bar)
val myList: java.util.List[Foo] = ...
val result: Predef.Map[String, Bar] =
    {
        for {
            foo <- myList
        } yield (foo.name, foo.bar)
    } toMap

но тогда я предполагаю, что карта не будет упорядочена, и мне нужен явный вызов toMap.

Как мне этого добиться?

Ответы [ 2 ]

7 голосов
/ 30 сентября 2010

collection.breakOut - ваш хороший друг в таком случае,

val result: collection.immutable.ListMap[String, Bar] = 
  myList.map{ foo => (foo.name, foo.bar) }(collection.breakOut)

Если важно использовать выражение для понимания, это будет сделано следующим образом:

val result: collection.immutable.ListMap[String, Bar] = {
  for { foo <- myList } yield (foo.name, foo.bar)
}.map(identity)(collection.breakOut)

Scala 2.8 breakOut очень хорошо объяснил collection.breakOut .

4 голосов
/ 30 сентября 2010

Вы можете сделать это, используя объект-компаньон класса ListMap следующим образом:

class Bar
class Foo(val name: String, val bar: Bar)
val myList: java.util.List[Foo] = ...
val result = ListMap((for(foo <- myList) yield (foo.name, foo.bar)):_*)
...