Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在scala中添加两个List[Map[String,Any]]会将输出结果类型更改为List[Equals]?_Scala - Fatal编程技术网

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

为什么在scala中添加两个List[Map[String,Any]]会将输出结果类型更改为List[Equals]?,scala,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),

下面是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]]
  }
)
更新:如果您确实需要一个包含单个
映射的
列表
,您可以通过减少
列表
来调整上述代码:

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
,因为重叠的键会相互覆盖。要克服这一点,您需要使用
半组
类型类的combine函数。请注意,您需要提供证据证明
Map
中的值也符合
半群

为什么不
Map(…)
而不是
List(…)。toMap
?我需要类似List的最终结果(Map(“a”->1,“b”->“t”,“c”->1,“d”->“t”))上面的解决方案给了我List(Map(a->1,b->t),Map(c->1,dt您需要一个包含单个
映射的
列表
有什么原因吗?如果您真正感兴趣的是
地图
,我建议您使用
reduce