class ComparisonKeyDifference extends ComparisonDifference {

  static final String TEMPLATE_FOR_KEY_DIFFERENCE = "map key difference:%n" +
                                                    "- actual key  : %s%n" +
                                                    "- expected key: %s";

  final Object actualKey;
  final Object expectedKey;

  public ComparisonKeyDifference(DualValue dualValue, Object actualKey, Object expectedKey) {
    super(dualValue);
    this.actualKey = actualKey;
    this.expectedKey = expectedKey;
  }

  @Override
  public String toString() {
    return format("ComparisonDifference [path=%s, actualKey=%s, expectedKey=%s]", concatenatedPath, actualKey, expectedKey);
  }

  @Override
  public String multiLineDescription(Representation representation) {<FILL_FUNCTION_BODY>}
}

    UnambiguousRepresentation unambiguousRepresentation = new UnambiguousRepresentation(representation, actual, expected);
    UnambiguousRepresentation unambiguousKeyRepresentation = new UnambiguousRepresentation(representation, actualKey,
                                                                                           expectedKey);
    return format(DEFAULT_TEMPLATE + "%n" + TEMPLATE_FOR_KEY_DIFFERENCE,
                  fieldPathDescription(),
                  unambiguousRepresentation.getActual(),
                  unambiguousRepresentation.getExpected(),
                  "",
                  unambiguousKeyRepresentation.getActual(),
                  unambiguousKeyRepresentation.getExpected());
  
<methods>public void <init>(org.assertj.core.api.recursive.comparison.DualValue) ,public void <init>(org.assertj.core.api.recursive.comparison.DualValue, java.lang.String) ,public void <init>(org.assertj.core.api.recursive.comparison.DualValue, java.lang.String, java.lang.String) ,public int compareTo(org.assertj.core.api.recursive.comparison.ComparisonDifference) ,public boolean equals(java.lang.Object) ,public java.lang.Object getActual() ,public Optional<java.lang.String> getAdditionalInformation() ,public List<java.lang.String> getDecomposedPath() ,public java.lang.Object getExpected() ,public java.lang.String getTemplate() ,public int hashCode() ,public java.lang.String multiLineDescription() ,public java.lang.String multiLineDescription(org.assertj.core.presentation.Representation) ,public static org.assertj.core.api.recursive.comparison.ComparisonDifference rootComparisonDifference(java.lang.Object, java.lang.Object, java.lang.String) ,public java.lang.String toString() <variables>public static final java.lang.String DEFAULT_TEMPLATE,private static final java.lang.String FIELD,private static final java.lang.String TOP_LEVEL_ELEMENTS,private static final java.lang.String TOP_LEVEL_ELEMENT_PATTERN,private static final java.lang.String TOP_LEVEL_OBJECTS,final non-sealed java.lang.Object actual,final non-sealed Optional<java.lang.String> additionalInformation,final non-sealed java.lang.String concatenatedPath,final non-sealed List<java.lang.String> decomposedPath,final non-sealed java.lang.Object expected,final non-sealed java.lang.String template