有条件地在 Scala 中创建不可变哈希集
Creating immutable Hashsets in scala conditionally
我有一个小函数可以做到这一点
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
相同。我看到一个类似的问题here。然而,创建多个 Seq
然后从中创建一个哈希集看起来有点过头了。
如果您想要将少量且固定数量的值转换为集合,我会使用
Set.empty[DateTime] ++ Option(a) ++ Option(b) ++ Option(c) ++ Option(c)
如果您有大量或可变数量的值,Patryk 的解决方案似乎是最好的。
应要求,我将我的评论移至答案。
最简单直接的选择是:
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
我有一个小函数可以做到这一点
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
相同。我看到一个类似的问题here。然而,创建多个 Seq
然后从中创建一个哈希集看起来有点过头了。
如果您想要将少量且固定数量的值转换为集合,我会使用
Set.empty[DateTime] ++ Option(a) ++ Option(b) ++ Option(c) ++ Option(c)
如果您有大量或可变数量的值,Patryk 的解决方案似乎是最好的。
应要求,我将我的评论移至答案。
最简单直接的选择是:
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