【发布时间】:2015-12-16 13:21:38
【问题描述】:
我的数据类型是:List[(Option[Set[Long]], Option[Set[(Long, Long)]])](即一个 2 元组选项的列表,一个用于一组 Long,一个用于一组 2 元组 Long)。例如:
val l = List((Option(Set(1L, 2L, 3L)), Option(Set((4L, 5L), (6L, 7L)))))
我希望将这个 List 平面映射为 List[Set[Long]] 类型,这样第二个选项的第一个元素中的每一个都将与第一个选项连接到一个新的 Set 上。所以这里想要的结果是:
List(Set(1L, 2L, 3L, 4L), Set(1L, 2L, 3L, 6L))
这适用于以下代码:
l.flatMap {
case(setOpt1, setOpt2) =>
val set1 = setOpt1.getOrElse(Set[Long]());
val set2 = setOpt2.getOrElse(Set[(Long, Long)]());
set2.map(k => set1 ++ Set(k._1))
}
当第二个选项为None,第一个选项“存在”时,情节变厚,例如:
val l = List((Option(Set(1L, 2L, 3L)), None))
假设我无法避免这种情况。在这种情况下,我想按原样获取第一个 Set:
List(Set(1L, 2L, 3L))
但是,使用与上面相同的代码,set2 值变成了一个空 Set,而 map 在这种情况下没有任何意义,我会得到一个空 List:
res60: List[scala.collection.immutable.Set[Long]] = List()
那么,我该怎么做呢?最好优雅:)
【问题讨论】:
-
您说明了
(Some,Some)和(Some,None)应该发生什么。(None,Some)和(None,None)呢? -
(None, None)和(None,Some)都按预期工作:第一种情况返回空列表,第二种情况返回List(Set(4L), Set(6L))。