番石榴 - 仅从左/右获取密钥并添加为ValueDifference

时间:2017-10-03 19:27:45

标签: java guava

我在这里使用Guava来比较2个地图,但我需要从右侧获取所有新密钥,并从左侧获取旧密钥。 问题是我需要将它们添加到entriesDiffering()方法返回的对象类型Map<String, ValueDifference<Object>>

任何人都知道如何做到这一点? entriesOnlyOnRight / Left给我一个Map对象,ValueDifference是一个接口。

欢迎任何帮助。 非常感谢。

1 个答案:

答案 0 :(得分:1)

ValueDifference仅适用于包含相同键和不同值的两个映射中的条目。这对entriesOnlyOnRight() / entriesOnlyOnLeft()没有意义,因为你知道另一方面没有什么可比较的。

让我举个例子:

@Test
public void shouldUseMapsDifferenceCorrectly() {
  //given
  ImmutableMap<String, Integer> first = ImmutableMap.of(
      "one", 01, // 1 in octal
      "two", 02, // 2 in octal
      "ten", 010 // 8 in octal
  );
  ImmutableMap<String, Integer> second = ImmutableMap.of(
      "two", 2,
      "three", 3,
      "ten", 10
  );
  //when
  final MapDifference<String, Integer> difference = Maps.difference(first, second);
  //then
  assertThat(difference.areEqual()).isFalse();
  assertThat(difference.entriesDiffering())
      .hasSize(1)
      .hasEntrySatisfying("ten", valueDifference -> {
        assertThat(valueDifference.leftValue()).isEqualTo(8);
        assertThat(valueDifference.rightValue()).isEqualTo(10);
      })
      .hasToString("{ten=(8, 10)}");
  assertThat(difference.entriesOnlyOnLeft())
      .containsExactly(entry("one", 1));
  assertThat(difference.entriesOnlyOnRight())
      .containsExactly(entry("three", 3));
  assertThat(difference.entriesInCommon())
      .containsExactly(entry("two", 2));
}

(我使用AssertJ,但代码应该是不言自明的。)