Проблема в построении карты из различий карт, вычисленных Guava

#java #json #casting #guava

#java #json #Кастинг #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""
  

Может кто-нибудь, пожалуйста, помочь здесь?

Комментарии:

1. Не могли бы вы предоставить какой-нибудь код, показывающий oldMap и currMap создающий?

Ответ №1:

Вы используете необработанные типы в своем определении карты. Вот исправленная версия, которая должна работать для вас:

 //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""))
        );