3

順序付きマップに割り当てることができるものを返す for-comprehension を使用するにはどうすればよいですか? これは私が持っているコードを簡略化したものです:

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)

タプルが for-comprehension から返される順序で、結果が順序付けられた Map であることを確認する必要があります。

上記で、エラーが発生します:

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)

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を非常によく説明しています。

于 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 に答える