2009-03-23 11 views

Répondre

7

Il y a deux parties à la réponse. La première partie est que les méthodes d'arguments variables de Scala qui prennent un T * sont des méthodes de suralimentation prenant Seq [T]. Vous dites à Scala de traiter un Seq [T] comme une liste d'arguments au lieu d'un seul argument en utilisant "seq: _ *".

La deuxième partie convertit une collection [T] en une séquence [T]. Pour le moment, il n'y a pas encore de méthode générale dans les librairies standard de Scala, mais un moyen très facile (sinon efficace) de le faire consiste à appeler toArray. Voici un exemple complet.

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) 

Notez le scala.Predef.Set et scala.collection.immutable.HashSet sont synonymes.

+0

Il se trouve que je ne peux pas faire cela parce que ma collection « intérieure » est en fait une instance de java.util. Liste, pas un Scala Seq. J'ai posé cette question à titre de suivi: http://stackoverflow.com/questions/674713/converting-java-collection-into-scala-collection –

11

La façon la plus concise pour ce faire est probablement d'utiliser l'opérateur ++:

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