數據校驗是業務模塊開發中必不可少的部分,數據的安全關係到系統是否正常運行,在最近的業務開發工做中,我便遇到了對配置文件信息進行校驗的需求。配置文件是系統很是重要的一部分,若是配置文件數據配置錯誤,那麼系統基本上也就完了。因此必須對數據可靠性進行校驗。程序員
讀取配置文件信息保存到內存,並提供接口給其餘模塊調用。(須要對空數據,重複數據進行剔除)算法
剛開始寫個人想法是將語言json
數據轉換成Map
集合,而後經過fastjson
框架將數據轉換成相應的語言對象Map
集合,經過對Map
中數據遍歷進行空數據剔除和數據重複剔除操做,這種方法確實是實現了我想要的功能。json
由於我須要讀取好幾個Json
文件,我用上述方法實現第二個配置文件讀取的時候,我完全受不了了,此時我在想有什麼方法能夠去重的嗎,我想到了HashMap
中key值是不容許重複的,因此我想着使用HashMap
去解決這個問題,我去網上也找了資料,確實HashMap
key不重複能夠解決去重問題,可是對於個人需求仍是不夠。(第一種實現代碼就不貼出來了,實在太難看T_T)
因此此時我想到了集合框架,平時經常使用的集合類主要是List,HashMap
等,對其餘集合類根本不熟悉。我決定對集合框架進行深刻學習。果真經過對Set
的學習,我找到了解決方法,Set
集合不容許存在重複對象,咱們也能夠自定義重複的標準。因此我決定第二次嘗試。緩存
TreeSet
是一個存儲不重複數據,並能對數據進行排序的集合。此處正是用來數據排序這個特色實現的。咱們能夠重寫對象比較的方法:compareTo()
實現控制對象是否塞進Set
集合。
安全
實現代碼:
一、定義Language
類,須要實現Comparable
接口,此接口的compareTo()
方法即爲對象重複的比較方法bash
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Language implements Comparable<Language>{
private Integer id;
private String name;
private String abbr;
private String desc;
/**
* 實現compareTo方法,以在TreeSet中對語言對象進行去重及去空
* @param language
* @return
*/
@Override
public int compareTo(Language language) {
/*返回轉態值說明
* 返回0,說明對象不塞進TreeSet中
* 返回-1和1,對象不重複,塞進Set中,值只是關係到對象排序問題
*/
//名稱和縮寫屬性非空校驗,若是存在某個屬性爲空,則返回0
if(this.getName()==null||this.getAbbr()==null||language.getAbbr()==null || language.getName()==null||
this.getName().equals("")||this.getAbbr().equals("")||language.getName().equals("")||language.getAbbr().equals("")){
return 0;
}
//名稱和縮寫屬性重複校驗,若是存在某個屬性相同則判斷爲重複對象,返回0
if(this.getName().equals(language.getName())||this.getAbbr().equals(language.getAbbr())){
return 0;
}
//經過id進行順序比較,返回-1,說明id小
if (this.getId()<language.getId()) {
return -1;
}
if (this.getId()>language.getId()) {
return 1;
}
else {
//若是id相等的話就沒法添加
return 0;
}
}
}
複製代碼
二、主體實現方法:此處是監聽nacos
動態配置的json
數據,info
即爲讀取到的json
數據數據結構
public void listen(String dataId,String group){
nacosListener.listenConfig(dataId,group,(String info)->{
logger.info("開始讀取語言配置");
//使用fastjson轉換json數據爲Map數據
Map languages= JSONObject.parseObject(info,Map.class);
Set<Language> languageSet=new TreeSet<>();
//轉換成語言對象Set,此時將數據塞進Set中,Set會去調用對象compareTo()方法
languages.forEach((k,v)->{
//TreeSet中compareTo()方法進行重寫,以去除重複數據及空數據
Language language=JSONObject.parseObject(v.toString(),Language.class);
Integer id=Integer.parseInt(k.toString());
language.setId(id);
languageSet.add(language);
});
//將數據變存儲到緩存中
languageSet.forEach((language)->LanguageCache.languageMap.put(language.getId().toString(),language));
logger.info("讀取語言數據完成");
});
}
複製代碼
顯然第二次方法是很簡便的,避免了對Map
集合的重複遍歷(第一次的時候我須要對Map
進行三次遍歷),提升了性能,代碼也簡潔了;
由此我也知道了做爲一個程序員,熟練掌握基礎知識的重要性,懂得原理,才能更好的去使用工具!!!,數據結構和算法是咱們必須熟練掌握的基礎知識。因此建議你們對基礎知識仍是得掌握。框架