Scala эквивалент нового HashSet (Collection)

Что такое эквивалентный конструктор Scala (для создания неизменяемого HashSet) для Java

new HashSet<T>(c)

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

Все, что я могу найти в HashSet Object, apply.

Ответ 1

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

Вторая часть преобразует сборник [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 - синонимы.

Ответ 2

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

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