58

Seqたとえば、入力として一連の文字列があり、入力とアイテムの要素で構成される新しい不変を取得したいとします"c"。これが私が働いていることを発見した2つの方法です:

  1. assert(Seq("a", "b", "c") == Seq("a", "b") ++ Seq("c"))-これの問題は、操作のためだけに一時シーケンス(Seq("c"))をインスタンス化することは冗長であり、オーバーヘッドが発生するように見えることです。
  2. assert(Seq("a", "b", "c") == List("a", "b") ::: "c" :: Nil)-これは、入力コレクションのタイプをに制限しているListため、機能しSeq("a", "b") ::: "c" :: Nilません。また、インスタンス化するNilとオーバーヘッドが発生する可能性もあるようです

私の質問は次のとおりです。

  1. この操作を実行する他の方法はありますか?
  2. どちらがいいですか?
  3. Seq("a", "b") ::: NilScalaの開発者の欠陥は許されていませんか?
4

1 に答える 1

123

:+(追加)演算子を使用して、次を使用して新しいを作成します Seq

val seq = Seq("a", "b") :+ "c"
// seq is now ("a","b","c")

注::+ 新しいSeqオブジェクトを作成します。あなたが持っている場合

val mySeq = Seq("a","b")

そしてあなたは電話します

mySeq :+ "c"

mySeqまだ("a","b")

Seqの一部の実装は、他の実装よりも追加に適していることに注意してください。List付加用に最適化されています。Vector高速な追加および追加操作があります。

:::Listパラメータとして別のものを必要とするメソッドですList-他のタイプのシーケンスを受け入れることであなたが見る利点は何ですか?他のタイプをに変換する必要がありListます。Listそれがユースケースにとって効率的であることがわかっている場合は、 :::(必要に応じて)を使用します。ポリモーフィックな動作が必要な場合は、ジェネリックを使用して++ください。

Nil;を使用することによるインスタンス化のオーバーヘッドはありません。シングルトンであるため、インスタンス化しないでください。

于 2011-11-28T12:21:54.660 に答える