根据Guava计算的地图差异构建地图的问题



我正在使用Google Guava来计算两张地图之间的差异,然后利用这些差异,我想再构建一张地图进行进一步处理,如下所示:

Map<String, Map<String, Object>> fieldToDiffMap = new HashMap<>();
MapDifference<String, LinkedHashMap> diff =
Maps.difference(oldMap, currMap);
Map<String, MapDifference.ValueDifference<LinkedHashMap>> entriesDiffering = diff
.entriesDiffering();
for (Map.Entry<String, MapDifference.ValueDifference<LinkedHashMap>> entry :
entriesDiffering.entrySet()) {

Map<String, String> diffMap = new HashMap<>();
MapDifference.ValueDifference<LinkedHashMap> valueDiff = entry.getValue();
diffMap.put("Old Value", valueDiff.leftValue().get("value"));  <--THIS LINE GIVING ERROR
diffMap.put("New Value", valueDiff.rightValue().get("value")); <--THIS LINE GIVING ERROR
fieldToDiffMap.put(entry.getKey(), diffMap);
}

这里,我得到了一个编译器错误:

incompatible types: java.lang.Object cannot be converted to java.lang.String

我试着通过替换上面的两行来处理这个问题,如下所示:

diffMap.put("Old Value", valueDiff.leftValue().get("value").toString());
diffMap.put("New Value", valueDiff.rightValue().get("value").toString());

但有了这些更改,编译器错误消失了,代码运行成功,但字符串被嵌入到附加引号之间,如下所示:

"Test String" is getting converted into ""Test String""

有人能帮忙吗?

您在地图定义中使用原始类型。这里有一个固定的版本,应该适用于你:

//given
Map<String, Map<String, Object>> fieldToDiffMap = new HashMap<>();
Map<String, LinkedHashMap<String, Object>> oldMap = ImmutableMap.of(
"foo", Maps.newLinkedHashMap(ImmutableMap.of("value", "Test String")),
"bar", Maps.newLinkedHashMap(ImmutableMap.of("value", "Same String"))
);
Map<String, LinkedHashMap<String, Object>> currMap = ImmutableMap.of(
"foo", Maps.newLinkedHashMap(ImmutableMap.of("value", ""Test String"")),
"bar", Maps.newLinkedHashMap(ImmutableMap.of("value", "Same String"))
);
//when
MapDifference<String, LinkedHashMap<String, Object>> diff = // not raw types MapDifference<String, LinkedHashMap> diff
Maps.difference(oldMap, currMap);
Map<String, MapDifference.ValueDifference<LinkedHashMap<String, Object>>> entriesDiffering = diff
.entriesDiffering();
for (Map.Entry<String, MapDifference.ValueDifference<LinkedHashMap<String, Object>>> entry :
entriesDiffering.entrySet()) {
Map<String, Object> diffMap = new HashMap<>();
MapDifference.ValueDifference<LinkedHashMap<String, Object>> valueDiff = entry.getValue();
diffMap.put("Old Value", valueDiff.leftValue().get("value"));//  <--THIS LINE GIVING ERROR
diffMap.put("New Value", valueDiff.rightValue().get("value"));// <--THIS LINE GIVING ERROR
fieldToDiffMap.put(entry.getKey(), diffMap);
}
//then
assertThat(fieldToDiffMap) // {foo={Old Value=Test String, New Value="Test String"}}
.containsOnly(entry("foo", ImmutableMap.of(
"Old Value", "Test String",
"New Value", ""Test String""))
);

最新更新