Scala-Map[String,Int]类抛出灾难



在单元测试中断言一个Map[String, Int]到另一个:

Map(bar -> 114, foo -> 5) did not equal Map("foo" -> 5, "bar" -> 114)

请注意,键没有在左边引用,而是在右边引用。

左派在卡夫卡和Avro的连载中来回穿梭,作为GenericRecord的一部分。右边是我这样构建的测试夹具:

program_int_args = Map[String, Int]("foo" -> 5, "bar" -> 114)

一旦我从卡夫卡那里得到它,我就会解码Avro消息,如下所示:

val program_int_args_ =
record.get("program_int_args")
.asInstanceOf[java.util.Map[String, Integer]]
.asScala
.toMap[String, Integer]
.mapValues(Integer2int(_))

问题:

  1. 为什么GenericRecord中没有引号
  2. 为什么在构建的地图上会出现引号
  3. 我怎样才能使这些相等

根据Thomas Klager的评论,我检查了密钥的类别,事实上它们是不同的:

class org.apache.avro.util.Utf8 did not equal class java.lang.String

因此更新问题:

Utf8类型怎么可能是Map[String, Int]中的键,却不等于与String相同的数据?

我认为由于类型擦除,两种转换都是

.asInstanceOf[java.util.Map[String, Integer]]
.toMap[String, Integer]

不要真正检查映射中键和值的类型。

你可以试试

val program_int_args_ =
record.get("program_int_args")
.asInstanceOf[java.util.Map[Object, Integer]]
.asScala
.toMap[Object, Integer]
.map { case (k, v) => (k.toString, Integer2int(v))}

而是将键转换为String。

最新更新