在我們日常寫代碼過程中經常會遇到一些非常簡單但是必須需要書寫的代碼,但是使得我們代碼不夠優雅,比如判空,獲取hash值,判斷是否相等,這些代碼簡單,但是經常需要書寫,那我們能不能用更加優雅的處理它們?
今天介紹一下如何一行代碼處理那些板樣代碼,第一期主要是對判空做一些優雅的建議
爲了減少板樣代碼對業務代碼的入侵,首先我們可以使用jdk的Objects類
Objects.requireNonNull(str)//f參數爲空會拋出NullPointerException
Objects.requireNonNull(str,"str can't be null")//f參數爲空會拋出NullPointerException,message 爲第二個參數
Objects.requireNonNull(str,()->"str can't be null")//f參數爲空會拋出NullPointerException,第二個是一個lambda表達式生成一個message
如果我們需要在判空的邏輯裏面需要做邏輯怎麼辦?
可以使用
if(Objects.isNull(str)){//null 返回true //TODO something }
if(Objects.nonNull(str)){//null返回false //TODO something }
除此以外我們在java8 以及guava裏面引入了Optional這個類,簡單介紹一下java8的Optional
這個類的結構很簡單,一個泛型類,裏面只放我們需要的值,進行一個包裝一樣,成員方法主要是進行一些判空操作。我就簡單介紹一下用法。
其實在Optional裏面用到大量的Objects類,對於一般的對象以上基本可以滿足需求,讓你代碼看起來就會逼格就不一樣了。
但是有一些特殊的對象還需要特殊的判斷,比如String,以及各種集合類,我們可以使用commons包,裏面的,以及StringUtils對String進行操作,比如isEmpty(String str)(null,以及空字符串返回true),isNotEmpty(String str),remove,contains等操作,雖然String本身就有remove這些操作但是有可能當對象爲null時會拋空指針異常,比如
String s=null; s.contains("123");//拋出空指針String s=null;StringUtils.contains(s,"123");//這裏會對null進行判斷,返回false
除此以外還有提供空字符串常量StringUtils.EMPTY 目的是減少魔法數值使用
對於集合類也有類似的工具類CollectionUtils,提供判空CollectionUtils.isEmpty(Collection c)(集合爲空或者爲null返回true),以及對集合操作。
以上基本上是優化判空代碼層面的優化。
對於Objects類還有比較對象的equals(Object a,Object b)方法,針對數組的deepEquals的方法,hashCode(Object o)
hash(Object... values),compare(T a,T b,Compare<? super T> c)
其最大的好處就是:
-
減少我們寫邏輯重複的板樣代碼
-
減少我們對null的判斷,減少不必要的空指針異常
所以建議對 String以及集合的各種操作儘可能使用成熟的jdk工具或第三方庫比如guava,減少板樣代碼,以及一些不必要的問題發生,這些工具類使用起來也很簡單。
以上只是對優化判空代碼的建議,有不足之處,希望多多提一些建議
第一期比較簡單,下期還有試用的騷操作~敬請關注