在scala中有条件地创建不可变哈希集

在scala中有条件地创建不可变哈希集,scala,immutability,Scala,Immutability,我有一个很小的函数,它可以做到这一点 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.muta

我有一个很小的函数,它可以做到这一点

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
,然后从中创建一个哈希集看起来太过分了。

如果您有一个小的固定数量的值要转换为一个集,我会使用

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

如果您有大量或可变数量的值,Patryk的解决方案似乎是最好的。

对于每个请求,我将把我的注释移动到一个答案

最简单、最直接的选择是:

Seq(a,b,c,d).filter(_ != null).toSet
或者,您可以先将元素转换为
选项[DateTime]

val seq = Seq(a,b,c,d).map(Option.apply)
然后,一旦你有了一个
Seq[选项[DateTime]]
你就可以做:

seq.flatten.toSet

我的解决方案很简单:
Seq(a,b,c,d)。filter(!=null)。toSet
(或者,例如,
Seq(a,b,c,d)。map(Option.apply)。flatte.toSet
,如果你想使用选项)@PatrykĆwiek我喜欢它。我们能把地图改成平面图吗?我想没有原因,在这种情况下,我们先展平,然后映射到这里,我们先映射,然后展平。我说的对吗?@PatrykĆwiek如果我们使用选项:
Seq(a,b,c,d).filter(u.isDefined).map(u.get).toSet
@Sohaib也应该有效,尽管使用
选项
上的get
通常看起来可疑(有时是使用不同的过梁发出的警告/错误,具体取决于设置)。如果你从一个
Seq[Option[DateTime]]
开始,那么只需
Seq.flatte.toSet
就可以了。除了过滤和展平,你还可以使用:Seq(选项(1),选项(2),无,无,选项(5))。收集{case x:Option[Int]If x.nonEmpty=>x.get}