開源Java物件比較器java-object-diff實戰講解
簡介
java-object-diff 是一個簡單但功能強大的尋找Java物件之間的差異的庫。這需要對比兩個物件,並能生成一個樹狀結構表示物件和他們的子物件之間的差異。然後,這個樹狀結構可以通過提取更多資訊或更改應用到底層的資料結構。
- 可以與你能想到的幾乎任何型別的物件和任意深度巢狀
- 發現兩個物件之間的差異
- 告訴你一切變化檢測結果
- 返回遍歷樹形結構形狀的差異
- 提供讀寫訪問底層物件,讓你不僅要提取改變的值,而且可以應用差異作為一個補丁。
- 不需要改變現有的類(在大多數情況下)
- 提供了一個非常靈活的配置API來定製您的一切需要
- 微小簡單但非常強大的API
- 檢測並處理物件圖中的迴圈引用
- 除了SLF4J沒有其他執行依賴
- 與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
相關文章
- Java 比較器Java
- 哪些開源雲工具比較實用呢?
- js物件如何深比較?JS物件
- 常用的Java開發工具比較Java
- 【Java】Collection.sort以及比較器ComparatorJava
- Java集合詳解3:Iterator,fail-fast機制與比較器JavaAIAST
- java比較日期大小Java
- Java和JavaSciprt比較Java
- java--BEAN比較JavaBean
- 比較開源日誌:Logstash、FluentD 和 Fluent Bit
- 目前哪些開源雲監控工具比較好用!
- js物件陣列Date的比較JS物件陣列
- js 防抖實戰講解JS
- JAVA中的Comparable介面和自定義比較器Java
- [C++] 自定義C++比較器比較大小C++
- Java的BigDecimal比較大小JavaDecimal
- 開源向量資料庫比較:Chroma, Milvus, Faiss,Weaviate資料庫AI
- asp.net core 比較好的開源專案ASP.NET
- 盤點 7 月份比較火的開源專案
- 四種在Javascript比較物件的方法JavaScript物件
- javascript訪問不同物件的速度比較JavaScript物件
- Python小知識之物件的比較Python物件
- immer.js 實戰講解文件JS
- SpringBoot事物Transaction實戰講解教程Spring Boot
- Prometheus PromQL 講解與實戰操作PrometheusMQ
- 前端動效講解與實戰前端
- 廣州牽引力講述java開發師怎樣規劃職業發展比較好?Java
- java開發的第十五個部落格(Collections工具類和比較器)Java
- ElasticSearch實戰系列七: Logstash實戰使用-圖文講解Elasticsearch
- 比較器-Comparable和Comparator
- RowFish -- 開源一款比較好看的docusaurus主題
- Java動態代理 jdk和cglib的實現比較JavaJDKCGLib
- Java實體對映工具MapStruct 與BeanUtils效能比較JavaStructBean
- Java中List集合效能比較Java
- Java 字串比較、拼接問題Java字串
- Java 中 Comparable 和 Comparator 比較Java
- Java字串建立方式比較Java字串
- 比Sqoop功能更加強大開源資料同步工具DataX實戰OOP