为什么添加两个List[Map[String,Any]]会将scala中的输出结果类型更改为List[Equals]



以下是REPL命令

scala> val x = (
if(1==1) { 
List("a"->1, "b"->"t") 
} else {
List.empty[Map[String, Any]]
}
) ::: (
if(2==2) { 
List("c"->1, "d"->"t")
} else {
List.empty[Map[String, Any]]
})
// Output
x: List[Equals] = List((a,1), (b,t), (c,1), (d,t))
// needed output
x: List[Map[String, Any]]= List(Map("a"->1, "b"->"t", "c"->1, "d"->"t"))

我相信原因是因为它是List[Tuple2]List[Map[String, Any]]的共同特征。

如果你这样做,类型就会对齐:

val x = (
if (1 == 1) {
List(Map("a" -> 1, "b" -> "t"))
} else {
List.empty[Map[String, Any]]
}) ::: (
if (2 == 2) {
List(Map("c" -> 1, "d" -> "t"))
} else {
List.empty[Map[String, Any]]
}
)

UPDATE:如果您真的需要一个包含单个MapList,您可以通过减少List:来调整上面的代码

val x = List(
(
(if (1 == 1) {
List(Map("a" -> 1, "b" -> "t"))
} else {
List.empty[Map[String, Any]]
})
:::
(if (2 == 2) {
List(Map("c" -> 1, "d" -> "t"))
} else {
List.empty[Map[String, Any]]
})
).reduce(_ ++ _)
)

但是要注意连接Map,因为重叠的键会相互覆盖。为了克服这个问题,您需要使用Semigroup类型类的combine函数。请注意,您需要提供证据,证明Map中的值也符合Semigroup

最新更新