有条件地在scala中创建不可变的Hashsets

时间:2015-06-24 09:26:06

标签: 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是坏的(我可以使用选项)但是让我们暂时忘记它并且更多地关注如何使这个HashSet不可变。 MutableHashSetscala.collection.mutable.HashSet相同。我看到了一个类似的问题here。然而,创建多个Seq然后从中创建一个hashset看起来就像是一个过度杀伤。

2 个答案:

答案 0 :(得分:1)

如果您要将一小部分且固定数量的值转换为集合,我只会使用

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

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

答案 1 :(得分:1)

根据请求,我正在将评论移至答案。

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

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