3

別のコレクションを別のタイプにマッピングして、コレクションを作成する必要がある場合があります。たとえば、一部の関数はList[_]パラメーターの型として必要ですが、次のようにマッピングして生成する必要がありますIndexedSeq[_]

val r = (1 to n).map { ... }
someFunction(r.toList)

IndexedSeq[_]最初にのmapメソッドを呼び出してから別の を呼び出すことでこれを実現できますがtoList、これは冗長な中間コレクションを生成します。コードを簡潔に保ちながら、この冗長な手順を回避する方法はありますか?

4

3 に答える 3

9

の完全な署名を見てくださいmap

def map[B, That](f: (A) ⇒ B)(implicit bf: CanBuildFrom[List[A], B, That]): That

これの鍵は暗黙的CanBuildFromであり、これは結果コレクションが入力コレクションからどのように生成されるかを管理します。暗黙的なものを明示的なものに置き換えてCanBuildFrom、別の結果コレクションを作成することができます。

さらに良いことに、この明示的なメソッドを作成する必要はありません。の形で、すでにそこにありscala.collection.breakOutます。ScalaDocから:

元のコレクション(From')に関係なく、特定のターゲットコレクション(To')をビルドするCanBuildFromインスタンスを提供します。

したがって、を渡すと、メソッドcollection.breakOutに必要なものを正確に指定できます。map

val x = IndexedSeq(1,2,3,4,5)
x.map[Int, List[Int]](_ * 2)(collection.breakOut)
> res6: List[Int] = List(2, 4, 6, 8, 10) 
于 2013-02-18T10:09:46.807 に答える
3

collection.breakOut彼のコメントでom-nom-nomが述べているように、あなたの質問に対する答えはです。

breakOutmapメソッドに指定された追加の引数であり、単純にするために、次の場所からさまざまなタイプのコレクションを返すことができますmap

def directMapExample(seq: Seq[Int]): Set[Int] = seq.map(_ * 2)(collection.breakOut)

以下はコンパイル時に失敗することに注意してください。

def directMapExample2(seq: Seq[Int]): Set[Int] = seq.map(_ * 2)

詳細については、https://stackoverflow.com/a/1716558/298389を参照してください。

于 2013-02-18T10:02:47.547 に答える
0

ビューを使用すると役立つ場合がありますか?

val r = (1 to n).view.map { … }
someFunction(r.toList)

このmap関数は、上の厳密なトランスフォーマーRangeです。ただし、最初にそれをビューに変換すると、それRange(非厳密なコレクション) は非厳密な方法で実装されたオブジェクト内にラップされますmap。値の全範囲は、 を呼び出したときにのみ生成されtoListます。

于 2013-02-18T09:48:54.147 に答える