Преобразование коллекции Java в коллекцию Scala

java scala scala-collections scala-2.7

72087 просмотра

10 ответа

Связанный с вопросом переполнения стека 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( ... ) ) : _ *)
Автор: oxbow_lakes Источник Размещён: 09.06.2019 01:27

Ответы (10)


16 плюса

Решение

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

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

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

Автор: Jorge Ortiz Размещён: 24.03.2009 07:51

122 плюса

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

Автор: robinst Размещён: 19.10.2010 02:49

61 плюса

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

import scala.collection.JavaConverters._
val l = new java.util.ArrayList[java.lang.String]
val s = l.asScala.toSet
Автор: Ben James Размещён: 15.06.2011 11:11

25 плюса

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

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

import scala.collection.convert.wrapAll._

по предложению Александра Храмцова .

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

import scala.collection.convert.decorateAll._

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

import scala.collection.convert.wrapAsScala._

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

Автор: stempler Размещён: 18.08.2014 08:52

14 плюса

Вы также можете изучить эту превосходную библиотеку: 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
Автор: Surya Suravarapu Размещён: 12.05.2010 06:47

4 плюса

val array = java.util.Arrays.asList("one","two","three").toArray

val list = array.toList.map(_.asInstanceOf[String])
Автор: jamesqiu Размещён: 08.10.2010 07:26

2 плюса

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

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

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

Автор: Aaron Размещён: 23.03.2010 07:43

2 плюса

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

import collection.convert.wrapAll._
Автор: aleksandr_hramcov Размещён: 07.03.2014 05:38

1 плюс

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

val array = java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)
Автор: Fabian Steeg Размещён: 23.03.2009 06:50

0 плюса

Начиная 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")
Автор: Xavier Guihot Размещён: 29.03.2019 12:16
32x32