2011-11-28 12 views
44

Dire, ho una sequenza di stringhe come input e voglio ottenere un nuovo Seq immutabile che consiste di elementi dell'input e un elemento "c". Qui ci sono due metodi che ho scoperto di essere al lavoro:Aggiunta di un elemento a un immutabile Seq

  1. assert(Seq("a", "b", "c") == Seq("a", "b") ++ Seq("c")) - il problema con questo è che sembra che un'istanza di una sequenza temporanea (Seq("c")) solo per il gusto dell'operazione è rendundant e si tradurrà in overhead
  2. assert(Seq("a", "b", "c") == List("a", "b") ::: "c" :: Nil) - questo limita il tipo di raccolta di input per essere un List, quindi Seq("a", "b") ::: "c" :: Nil non funzionerà. Inoltre sembra che un'istanza di un Nil può aswell risultato in testa

Le mie domande sono:

  1. C'è un altro modo per eseguire questa operazione?
  2. Qual è il migliore?
  3. Non è consentito a Seq("a", "b") ::: Nil un difetto degli sviluppatori di Scala?
+0

Vedere anche http://stackoverflow.com/q/6559996/770361 per ':::' equivalente su non-elenchi –

risposta

88

Utilizzare la (aggiungere) operatore :+ per aggiungere un elemento a un Seq:

Seq("a", "b") :+ "c" 

noti che alcune implementazioni di Seq sono più adatti per l'aggiunta di altri. List è ottimizzato per prepending. Vector ha operazioni di accodamento e antefatto veloci.

::: è un metodo su List che richiede un altro List come parametro - quali sono i vantaggi che si vede in esso accettare altri tipi di sequenza? Dovrebbe convertire altri tipi in un List. Se sai che List è efficiente per il tuo caso d'uso, utilizza ::: (se necessario). Se si desidera un comportamento polimorfico, utilizzare il generico ++.

Nessun sovraccarico di istanziazione per l'utilizzo di Nil; non lo istanziate perché è un singleton.

Problemi correlati