Связанный с вопросом о переполнении стека. Scala-эквивалент нового HashSet (Collection) , как мне преобразовать коллекцию Java ( java.util.List
скажем) в коллекцию Scala List
?
На самом деле я пытаюсь преобразовать вызов Java API в Spring SimpleJdbcTemplate
, который возвращает a java.util.List<T>
, в неизменяемый Scala HashSet
. Так например:
val l: java.util.List[String] = javaApi.query( ... )
val s: HashSet[String] = //make a set from l
Кажется, это работает. Критика приветствуется!
import scala.collection.immutable.Set
import scala.collection.jcl.Buffer
val s: scala.collection.Set[String] =
Set(Buffer(javaApi.query( ... ) ) : _ *)
java
scala
scala-collections
scala-2.7
Oxbow_lakes
источник
источник
Для справки в будущем: в Scala 2.8 это можно было бы сделать так:
import scala.collection.JavaConversions._ val list = new java.util.ArrayList[String]() list.add("test") val set = list.toSet
set
этоscala.collection.immutable.Set[String]
после этого.Также см. Ответ Бена Джеймса для более явного способа (с использованием JavaConverters), который, похоже, рекомендуется сейчас.
источник
JavaConversions
есть некоторые последствия, делающиеtoSet
звонок ненужным.Если вы хотите быть более явным, чем JavaConversions, продемонстрированные в ответе robinst , вы можете использовать JavaConverters:
import scala.collection.JavaConverters._ val l = new java.util.ArrayList[java.lang.String] val s = l.asScala.toSet
источник
JavaConversions ( ответ робинста ) и JavaConverters ( ответ Бена Джеймса ) устарели в Scala 2.10 .
Вместо JavaConversions используйте:
import scala.collection.convert.wrapAll._
как предложил aleksandr_hramcov .
Вместо JavaConverters используйте:
import scala.collection.convert.decorateAll._
Для обоих также есть возможность импортировать преобразования / конвертеры только в Java или Scala соответственно, например:
import scala.collection.convert.wrapAsScala._
Обновление: приведенное выше утверждение, что JavaConversions и JavaConverters устарели, кажется неправильным. В Scala 2.10 были некоторые устаревшие свойства, из-за которых при их импорте появлялись предупреждения об устаревании. Таким образом, альтернативный импорт здесь, кажется, только псевдонимы. Хотя я все же предпочитаю их, так как ИМХО названия более подходящие.
источник
Вы также можете изучить эту отличную библиотеку: scalaj-collection, которая имеет двустороннее преобразование между коллекциями Java и Scala. В вашем случае, чтобы преобразовать java.util.List в Scala List, вы можете сделать это:
val list = new java.util.ArrayList[java.lang.String] list.add("A") list.add("B") list.asScala
источник
При запуске
Scala 2.13
пакетscala.jdk.CollectionConverters
заменяет пакетыscala.collection.JavaConverters/JavaConversions._
:import scala.jdk.CollectionConverters._ // val javaList: java.util.List[String] = java.util.Arrays.asList("one","two","three") javaList.asScala // collection.mutable.Buffer[String] = Buffer("one", "two", "three") javaList.asScala.toSet // collection.immutable.Set[String] = Set("one", "two", "three")
источник
val array = java.util.Arrays.asList("one","two","three").toArray val list = array.toList.map(_.asInstanceOf[String])
источник
Вы можете добавить информацию о типе в вызов toArray, чтобы параметризовать Set:
val s = Set(javaApi.query(....).toArray(new Array[String](0)) : _*)
Это может быть предпочтительным , так как пакет коллекции происходит через основные переделки для Scala 2.8 и пакет scala.collection.jcl это уходит
источник
Вы можете преобразовать коллекцию Java в массив, а затем создать из этого список Scala:
val array = java.util.Arrays.asList("one","two","three").toArray val list = List.fromArray(array)
источник
Еще один простой способ решить эту проблему:
import collection.convert.wrapAll._
источник