如何使用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调用。
我怎样才能做到这一点?
答案 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)):_*)