Scala for-comprehension返回有序地图

时间:2010-09-30 05:19:21

标签: scala scala-2.8 scala-collections

如何使用for-comprehension返回可以分配给有序Map的内容?这是我所拥有的代码的简化:

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)

我需要确保我的结果是一个有序的Map,顺序是从for-comprehension返回的元组。

有了上述内容,我收到错误:

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 个答案:

答案 0 :(得分:7)

collection.breakOut 在这种情况下是你的好朋友,

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

如果使用for-comprehension表达式很重要,将按如下方式进行,

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

答案 1 :(得分:4)

您可以通过使用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)):_*)