web-dev-qa-db-ja.com

不変のSeqにアイテムを追加する

入力として文字列のシーケンスがあり、入力の要素とアイテム_"c"_で構成される新しい不変のSeqを取得したいとします。私が働いていることがわかった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") ::: NilはScalaの開発者の欠陥を許されていませんか?
52
Nikita Volkov

使用 :+(追加)演算子を使用してnewSeqを作成します。

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を使用してもインスタンス化のオーバーヘッドはありません。それはシングルトンなので、インスタンス化しません。

113
Ben James