当试图Unit - ()从列表中删除所有,我试图打电话toMap.
scala> List((), ()).filter(_ != ()).toMap
<console>:8: error: Cannot prove that Unit <:< (T, U).
List((), ()).filter(_ != ()).toMap
^
Run Code Online (Sandbox Code Playgroud)
这个错误是什么意思?
对于a List,我想(String, String)为非Unit元素创建所有元组的映射,但是某些值可以为null.
scala> val x = List((), (), (3,4)).filter(_ != ()).toMap
<console>:7: error: Cannot prove that Any <:< (T, U).
val x = List((), (), (3,4)).filter(_ != ()).toMap
^
scala> val x = List((), (), (3,4)).filter(_ != ())
x: List[Any] = List((3,4))
scala> x.toMap
<console>:9: error: Cannot prove that Any <:< (T, U).
x.toMap
^
Run Code Online (Sandbox Code Playgroud)
啊! 现在你的另一个问题更有意义了。但仍然不确定你正在做什么来生成这个混合Unit/Tuple2列表。
这应该有效:
List((), (), (3,4)).collect { case t@(_: Int, _: Int) => t }.toMap
Run Code Online (Sandbox Code Playgroud)
请注意,我在这里使用变量绑定(将匹配绑定到t)来返回我们匹配的相同 Tuple2 实例,而不是创建一个新实例。
通过使用,collect您可以将列表的类型从 转换List[Any]为List[(Int, Int)],这正是所toMap需要的,因为它需要一些List[(A,B)].
注意:虽然这个答案应该对你有用,但我仍然认为你的设计有缺陷。你最好修复潜在的设计缺陷,而不是像这样治疗症状。
看起来这很适合使用Scala 的Optiontype。在这种情况下,您的示例列表将变为List(None, None, Some((3,4))),或者您可以将其写为List(None, None, Some(3->4))可读性(这样的嵌套括号可能会令人困惑)。
如果你使用的Option话,你的列表的类型就会变成List[Option[(Int, Int)]],这应该比 a 更好处理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)
Run Code Online (Sandbox Code Playgroud)
然而,如果您能够避免首先将这些条目放入列表中,那就更好了。None如果您使用 Scala 来生成此列表以进行理解,则可以在 for 表达式中使用防护来从输出中删除无效元素。
| 归档时间: |
|
| 查看次数: |
5397 次 |
| 最近记录: |