Scala-эквивалент нового HashSet(Коллекция)

Что такое эквивалентный конструктор Scala (чтобы создать неизменный HashSet) к Яве

new HashSet<T>(c)

где c имеет тип Collection<? extends T>?.

Все, что я могу найти в HashSet Объект apply,

3 ответа

Решение

Ответ состоит из двух частей. Первая часть заключается в том, что методы аргументов переменных Scala, которые принимают T*, являются перестановкой методов, принимающих Seq[T]. Вы указываете Scala рассматривать Seq [T] как список аргументов вместо одного аргумента, используя "seq: _*".

Вторая часть - это преобразование Collection[T] в Seq[T]. Пока нет общих встроенных способов сделать это в стандартных библиотеках Scala, но один очень простой (если не обязательно эффективный) способ сделать это - вызвать toArray. Вот полный пример.

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)

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

Наиболее краткий способ сделать это, вероятно, использовать ++ оператор:

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

Из Scala 2.13 используйте сопутствующий объект

      import scala.collection.immutable.HashSet
val list = List(1,2,3)
val set = HashSet.from(list)
Другие вопросы по тегам