2017-10-03 10 views
-1

私はここで2つのマップを比較するためにGuavaを使用していますが、右側からすべての新しいキーと左側から古いキーを取得する必要があります。 問題は、entriesDiffering()メソッドによって戻されたオブジェクト型Map<String, ValueDifference<Object>>にそれらを追加する必要があることです。Guava - 左右からキーを取得し、ValueDifferenceとして追加します

誰でもこの方法を知っていますか? entriesOnlyOnRight/Left Mapオブジェクトを与え、ValueDifferenceはインターフェイスです。

助けを歓迎します。 ありがとうございました。

+0

左から右サイドから*新しいキーと、古いキーで*、あなたは本当に一つのマップにあるが他のマップにはないキーを意味しますか? –

+0

right..objectsはentriesOnlyOnRightおよびentriesOnlyOnLeftメソッドから返されます。 ;) –

+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を使用しますが、コードは自明でなければなりません。)

+0

どのテストフレームワークを使用していますか? –

+0

@OlivierGrégoire[AssertJ](http://joel-costigliola.github.io/assertj/index.html)です。 – Xaerxess

+0

私はそれを知っています...それは意味をなさない...しかし、私のアプリでは、私はDynamoDBレコードから追加/削除された値がありません。だからこそ私はこのトリックをしたいのです。 ;) –

関連する問題