開源Java物件比較器java-object-diff實戰講解

FeelTouch發表於2019-01-28

簡介

java-object-diff 是一個簡單但功能強大的尋找Java物件之間的差異的庫。這需要對比兩個物件,並能生成一個樹狀結構表示物件和他們的子物件之間的差異。然後,這個樹狀結構可以通過提取更多資訊或更改應用到底層的資料結構。

  1. 可以與你能想到的幾乎任何型別的物件和任意深度巢狀
  2. 發現兩個物件之間的差異
  3. 告訴你一切變化檢測結果
  4. 返回遍歷樹形結構形狀的差異
  5. 提供讀寫訪問底層物件,讓你不僅要提取改變的值,而且可以應用差異作為一個補丁。
  6. 不需要改變現有的類(在大多數情況下)
  7. 提供了一個非常靈活的配置API來定製您的一切需要
  8. 微小簡單但非常強大的API
  9. 檢測並處理物件圖中的迴圈引用
  10. 除了SLF4J沒有其他執行依賴
  11. 與Java1.5及以上相容

使用方法

Using with Maven

<dependency>
    <groupId>de.danielbechler</groupId>
    <artifactId>java-object-diff</artifactId>
    <version>0.95</version>
</dependency>

Using with Gradle
compile 'de.danielbechler:java-object-diff:0.95'

實戰

public class JavaObjectDiff  {

    public static void main(String[] args) {

        Map<String, String> working = Collections.singletonMap("item", "foo");
        Map<String, String> base = Collections.singletonMap("item", "bar");
        DiffNode diff = ObjectDifferBuilder.buildDefault().compare(working, base);

        System.out.println(diff.hasChanges());
        System.out.println(diff.childCount() == 1);
        NodePath itemPath = NodePath.startBuilding().mapKey("item").build();
        System.out.println(diff.getChild(itemPath).getState() == DiffNode.State.CHANGED);

        /**
         * method1 Traversal
         */
        diff.visit(new DiffNode.Visitor() {
            @Override
            public void node(DiffNode node, Visit visit)
            {
                System.out.println(node.getPath() + " => " + node.getState());
            }
        });

        /**
         * method2 Reading Values
         */
        diff.visit(new DiffNode.Visitor() {
            @Override
            public void node(DiffNode node, Visit visit)
            {
                final Object baseValue = node.canonicalGet(base);
                final Object workingValue = node.canonicalGet(working);
                final String message = node.getPath() + " changed from " +
                        baseValue + " to " + workingValue;
                System.out.println(message);
            }
        });
}

輸出結果
true
true
true
/ => CHANGED
/{item} => CHANGED
/ changed from {item=bar} to {item=foo}
/{item} changed from bar to foo

原理說明

根據被比較物件的內部各層型別的equals方法進行比較,所以可以通過override來定義比較規則!

參考

官網:java-object-diff
Github: Github

相關文章