數據校驗---記一次讀取json配置數據,數據去重,去空

前言


數據校驗是業務模塊開發中必不可少的部分,數據的安全關係到系統是否正常運行,在最近的業務開發工做中,我便遇到了對配置文件信息進行校驗的需求。配置文件是系統很是重要的一部分,若是配置文件數據配置錯誤,那麼系統基本上也就完了。因此必須對數據可靠性進行校驗。程序員

需求說明


讀取配置文件信息保存到內存,並提供接口給其餘模塊調用。(須要對空數據,重複數據進行剔除)算法

實現過程


配置文件信息:

第一次嘗試:


  剛開始寫個人想法是將語言json數據轉換成Map集合,而後經過fastjson框架將數據轉換成相應的語言對象Map集合,經過對Map中數據遍歷進行空數據剔除和數據重複剔除操做,這種方法確實是實現了我想要的功能。json

第一次嘗試思考回顧:


  由於我須要讀取好幾個Json文件,我用上述方法實現第二個配置文件讀取的時候,我完全受不了了,此時我在想有什麼方法能夠去重的嗎,我想到了HashMap中key值是不容許重複的,因此我想着使用HashMap去解決這個問題,我去網上也找了資料,確實HashMap key不重複能夠解決去重問題,可是對於個人需求仍是不夠。(第一種實現代碼就不貼出來了,實在太難看T_T)
  因此此時我想到了集合框架,平時經常使用的集合類主要是List,HashMap等,對其餘集合類根本不熟悉。我決定對集合框架進行深刻學習。果真經過對Set的學習,我找到了解決方法,Set集合不容許存在重複對象,咱們也能夠自定義重複的標準。因此我決定第二次嘗試。緩存

第二次嘗試:使用TreeSet解決


  • 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進行三次遍歷),提升了性能,代碼也簡潔了;
  由此我也知道了做爲一個程序員,熟練掌握基礎知識的重要性,懂得原理,才能更好的去使用工具!!!,數據結構和算法是咱們必須熟練掌握的基礎知識。因此建議你們對基礎知識仍是得掌握。框架

相關文章
相關標籤/搜索