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

时间:2018-12-11 11:58:56

标签: scala

以下是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"))

1 个答案:

答案 0 :(得分:3)

我相信原因是因为这是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]]
  }
)

更新:如果您确实需要包含单个List的{​​{1}},则可以通过减少{{1 }}:

Map

但是请注意串联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(_ ++ _) ) 类型类的Combine函数。请注意,您需要提供证据证明Map中的值也符合Semigroup