3

我如何使用一个 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 调用。

我怎样才能做到这一点?

4

2 回答 2

7

在这种情况下, 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

于 2010-09-30T06:07:54.060 回答
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)):_*)
于 2010-09-30T06:10:48.533 回答