入力として文字列のシーケンスがあり、入力の要素とアイテム_"c"
_で構成される新しい不変のSeq
を取得したいとします。私が働いていることがわかった2つの方法があります:
assert(Seq("a", "b", "c") == Seq("a", "b") ++ Seq("c"))
-この問題は、操作のためだけに一時的なシーケンス(Seq("c")
)をインスタンス化するのは冗長であり、オーバーヘッドが発生するように見えることです。assert(Seq("a", "b", "c") == List("a", "b") ::: "c" :: Nil)
-これは、入力コレクションのタイプをList
に制限するため、Seq("a", "b") ::: "c" :: Nil
は機能しません。また、Nil
をインスタンス化するとオーバーヘッドが発生する可能性もあるようです私の質問は:
Seq("a", "b") ::: Nil
はScalaの開発者の欠陥を許されていませんか?使用 :+
(追加)演算子を使用して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
を使用してもインスタンス化のオーバーヘッドはありません。それはシングルトンなので、インスタンス化しません。