2009-03-23 8 views

Antwort

7

Es gibt zwei Teile zur Antwort. Der erste Teil ist, dass Scala-Variable-Argument-Methoden, die ein T * nehmen, ein Sugaring gegenüber Methoden sind, die Seq [T] verwenden. Sie sagen Scala, dass sie eine Seq [T] als eine Liste von Argumenten anstatt eines einzelnen Arguments mit "seq: _ *" behandeln soll.

Der zweite Teil konvertiert eine Sammlung [T] in eine Seq [T]. Es gibt noch keine allgemeine Möglichkeit, Scala-Standardbibliotheken zu erstellen, aber eine sehr einfache (wenn nicht sogar effiziente) Methode ist das Aufrufen von Array. Hier ist ein komplettes Beispiel.

scala> val lst : java.util.Collection[String] = new java.util.ArrayList 
lst: java.util.Collection[String] = [] 

scala> lst add "hello" 
res0: Boolean = true 

scala> lst add "world" 
res1: Boolean = true 

scala> Set(lst.toArray : _*) 
res2: scala.collection.immutable.Set[java.lang.Object] = Set(hello, world) 

Notiere die scala.Predef.Set und scala.collection.immutable.HashSet sind Synonyme.

+0

Wie ich dies nicht tun können, stellt sich heraus, weil meine „innere“ Sammlung tatsächlich eine Instanz von java.util ist. Liste, keine Scala Seq. Ich habe diese Frage als Follow-up gestellt: http://stackoverflow.com/questions/674713/converting-java-collection-into-scala-collection –

11

Die knappste Art und Weise, dies zu tun, ist wahrscheinlich die ++ Operator verwenden:

import scala.collection.immutable.HashSet 
val list = List(1,2,3) 
val set = HashSet() ++ list