Создание неизменных Hashsets в Scala условно

У меня есть небольшая функция, которая делает это

val s = MutableHashSet[DateTime]()
if (a != null) s.add(a)
if (b != null) s.add(b)
if (c != null) s.add(c)
if (d != null) s.add(d)
s

Я знаю, что использование null - это плохо (и я могу использовать option), но давайте пока что забудем об этом и сконцентрируемся больше на том, как сделать этот HashSet неизменным. MutableHashSet такой же как scala.collection.mutable.HashSet, Я видел подобный вопрос здесь. Однако создание нескольких Seq и затем хэш-сет из этого выглядит как слишком много излишнего.

2 ответа

Решение

По запросу я перевожу свой комментарий к ответу.

Самый простой и простой вариант:

Seq(a,b,c,d).filter(_ != null).toSet

Кроме того, вы можете преобразовать элементы в Option[DateTime] первый:

val seq = Seq(a,b,c,d).map(Option.apply)

а потом, когда у вас есть Seq[Option[DateTime]] ты можешь сделать:

seq.flatten.toSet

Если у вас есть небольшое и фиксированное количество значений, которые вы хотите преобразовать в набор, я бы просто использовал

Set.empty[DateTime] ++ Option(a) ++ Option(b) ++ Option(c) ++ Option(c)

Если у вас большое или переменное количество значений, решение от Patryk кажется лучшим.

Другие вопросы по тегам