Ah! Now 你的另一个问题更有意义一点。仍然不确定你正在做什么来生产这种混合的Unit
/Tuple2
不过列出来。
这应该有效:
List((), (), (3,4)).collect { case t@(_: Int, _: Int) => t }.toMap
请注意,我正在使用变量绑定在这里(将匹配绑定到t
)返回我们匹配的相同 Tuple2 实例,而不是创建一个新实例。
通过使用collect
您将列表的类型转换为List[Any]
to List[(Int, Int)]
,这就是toMap
想要,因为它期待一些List[(A,B)]
.
注意:虽然这个答案应该对你有用,但我仍然认为你的设计有缺陷。你最好修复潜在的设计缺陷,而不是像这样治疗症状。
看起来这很适合使用Scala's Option type。在这种情况下,您的样本列表将变为List(None, None, Some((3,4)))
,或者你可以把它写成List(None, None, Some(3->4))
为了可读性(像这样的嵌套括号可能会让人困惑)。
如果你使用Option
那么你的列表的类型就变成了List[Option[(Int, Int)]]
,这应该比处理好得多List[Any]
。为了摆脱None
条目并获得所需的List[(Int,Int)]
你可以打电话flatten
:
List(None, None, Some(3->4)).flatten
// res0: List[(Int, Int)] = List((3,4))
List(None, None, Some(3->4)).flatten.toMap
// res1: scala.collection.immutable.Map[Int,Int] = Map(3 -> 4)
然而,这将是甚至更好如果你可以避免把None
首先将条目添加到您的列表中。如果您使用 Scala 生成此列表以进行理解,您可以在 for 表达式中使用守卫从输出中删除无效元素。