Преобразование коллекции Java в коллекцию Scala - PullRequest
85 голосов
/ 23 марта 2009

Относительно вопроса переполнения стека Эквивалент Scala нового HashSet (Collection) , как мне преобразовать коллекцию Java (скажем, java.util.List) в коллекцию Scala List?

На самом деле я пытаюсь преобразовать вызов API Java в Spring * SimpleJdbcTemplate, который возвращает 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( ... ) ) : _ *)

Ответы [ 10 ]

122 голосов
/ 19 октября 2010

Для дальнейшего использования: в 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), который, кажется, рекомендуется сейчас.

61 голосов
/ 15 июня 2011

Если вы хотите быть более явным, чем JavaConversions, продемонстрированные в ответе robinst , вы можете использовать JavaConverters:

import scala.collection.JavaConverters._
val l = new java.util.ArrayList[java.lang.String]
val s = l.asScala.toSet
25 голосов
/ 18 августа 2014

JavaConversions ( ответ Робинста ) и JavaConverters ( ответ Бена Джеймса ) устарели с Scala 2.10 .

Вместо JavaConversions используйте:

import scala.collection.convert.wrapAll._

в соответствии с предложением aleksandr_hramcov .

Вместо JavaConverters используйте:

import scala.collection.convert.decorateAll._

Для обоих также есть возможность импортировать только преобразования / конвертеры в Java или Scala соответственно, например ::101027

import scala.collection.convert.wrapAsScala._

Обновление: Вышеприведенное утверждение о том, что JavaConversions и JavaConverters устарели, кажется неверным. В Scala 2.10 были некоторые устаревшие свойства, что приводило к появлению предупреждений об устаревании при их импорте. Таким образом, альтернативный импорт здесь представляется только псевдонимами. Хотя я все же предпочитаю их, поскольку ИМХО имена более уместны.

16 голосов
/ 24 марта 2009

Ваше последнее предложение работает, но вы также можете избежать использования jcl.Buffer:

Set(javaApi.query(...).toArray: _*)

Обратите внимание, что scala.collection.immutable.Set доступно по умолчанию благодаря Predef.scala.

14 голосов
/ 12 мая 2010

Вы также можете изучить эту превосходную библиотеку: 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
4 голосов
/ 08 октября 2010
val array = java.util.Arrays.asList("one","two","three").toArray

val list = array.toList.map(_.asInstanceOf[String])
2 голосов
/ 07 марта 2014

Еще один простой способ решения этой проблемы:

import collection.convert.wrapAll._
2 голосов
/ 23 марта 2010

Вы можете добавить информацию о типе в вызове toArray для параметризации Set:

 val s = Set(javaApi.query(....).toArray(new Array[String](0)) : _*)

Это может быть предпочтительнее, поскольку пакет коллекций проходит серьезную переработку для Scala 2.8 и пакет scala.collection.jcl исчезает

1 голос
/ 23 марта 2009

Вы можете преобразовать коллекцию Java в массив и затем создать список Scala из этого:

val array = java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)
0 голосов
/ 29 марта 2019

Начиная с 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")
...