高段位抗斤、不造輪子(善用工具類)

使用大眾的語言,交流才會有默契丈咐。寫代碼亦如此瑞眼!不要亂造輪子,積累輪子棵逊,搞懂輪子伤疙,最終站在巨人的肩上,才是正途辆影。

字符串操作

org.apache.commons.lang3.StringUtils中幾乎有你要的所有字符串操作徒像。
例如:Empty(空判斷)黍特、Blank(空白字符判斷)、truncate(保留部分長度)厨姚、左右保留衅澈、左右追加、trim(去掉首位字符ASCII碼小于32)谬墙、strip(去掉首位空白字符或指定字符)今布、重復(fù)、拼接拭抬、分割等等部默。

如果你需要獲取兩個字符串的共同前(后)綴nullToEmpty操作,com.google.common.base.Strings中你可以找到想要的造虎。

如果你需要根據(jù)組合復(fù)雜條件進行字符篩選傅蹂,過濾,刪除等操作算凿,com.google.common.base.CharMatcher是不錯的選擇份蝴,例如:

CharMatcher charMatcher = CharMatcher.inRange('0', '9').or(CharMatcher.inRange('a', 'b'));
System.out.println(charMatcher.retainFrom("abcd123dd")); //ab123
System.out.println(charMatcher.removeFrom("abcd123dd")); //cddd

千萬記住,如果能夠使用字符操作氓轰,盡量不要用字符串正則匹配婚夫,因為性能差一個量級,例如:

//三個方法同樣的效果署鸡,我機器上第一個方法性能差10倍
String uuid = UUID.randomUUID().toString();
System.out.println(StringUtils.removeAll(uuid, "-"));
System.out.println(StringUtils.remove(uuid, '-'));
System.out.println(CharMatcher.is('-').removeFrom(uuid));

如果需要連接成字符串的集合中有元素為null案糙,那你就要小心了,你可能需要com.google.common.base.Joiner靴庆。例如:

 //new一個有null元素的ArrayList
List list = Lists.newArrayList(new Integer(1), new Integer(2), null, new Integer(3));  
System.out.println(StringUtils.join(list.iterator(), ',')); //1,2,,3
System.out.println(Joiner.on(',').skipNulls().join(list)); //1,2,3
//System.out.println(Joiner.on(',').join(list)); //空指針

//new一個key或者value是null的Map
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", null);
map.put(null, 3);
System.out.println(Joiner.on(',').withKeyValueSeparator('-').useForNull("空").join(map)); //空-3,a-1,b-空 

記住一條时捌,對null沒有默認處理,不要想當(dāng)然炉抒,需要格外注意奢讨,例如:

 //StringBuilder會把null元素轉(zhuǎn)換為值為null的字符串
System.out.println(new StringBuilder().append((String) null).append('-').append("a")); //null-a

注意:字符串+就是 StringBuilder.append()

如果想要對字符串進行分割,最好不要使用StringUtils.split(),因為它的規(guī)則不夠清晰端礼,而是要用com.google.common.base.Splitter禽笑,例如:

String param = ", ,a,b  ,";
System.out.println(Arrays.toString(StringUtils.split(param, ','))); //[ , a, b  ]
System.out.println(Splitter.on(',').omitEmptyStrings().trimResults().splitToList(param)); //[a, b]

字符編碼(Charset)常量

不要糾結(jié)于選擇,來點默契蛤奥,定個約定:
優(yōu)先選擇com.google.common.base.Charsets
上面沒有引入就選org.apache.commons.codec.Charsets
最后jdk1.8才有的java.nio.charset.StandardCharsets

日期處理

日期增、減僚稿、字符串解析成Date凡桥,可以使用
org.apache.commons.lang3.time.DateUtils
日期格式化成字符串,可以使用
org.apache.commons.lang3.time.DateFormatUtils
如果需要指定瞬間進行日期時間初始化蚀同,可以使用org.joda.time.DateTime缅刽,例如:

System.out.println(new DateTime(2018, 12, 1, 13, 1, 1).toDate()); //Sat Dec 01 13:01:01 CST 2018

另外啊掏,SimpleDateFormat就不要再讓它出現(xiàn)了!

數(shù)字操作

不能不識:org.apache.commons.lang3.math.NumberUtils
提供了很多常用的基本類型包裝類的常量衰猛,以及很多便捷操作:

  • 字符串轉(zhuǎn)數(shù)字失敗返回默認值
    NumberUtils.toInt(java.lang.String, int)
    NumberUtils.toLong(java.lang.String, int)
    ......
    提供所有基本類型數(shù)字操作方法迟蜜,也有參數(shù)是一個的方法,默認值則是0啡省,如果你不想轉(zhuǎn)換拋出異常娜睛,就不要用原生API。
  • 返回最大或最小
    NumberUtils.max(...)
    NumberUtils.min(...)
    支持所有的基本類型數(shù)組卦睹,當(dāng)然如果你只有2個值比較畦戒, 下面方式可能會更好:
    java.lang.Math.max(x, y)
    java.lang.Math.min(x, y)

隨機生成器

字符串隨機生成,可以使用:
org.apache.commons.lang3.RandomStringUtils
注意:如果要生成只包含數(shù)字的字符串结序,
不能使用: RandomStringUtils.randomNumeric(int)
而要使用: RandomStringUtils.random(int, "0123456789")
因為性能有近10倍差距障斋,至于為什么?自行研究徐鹤。

隨機數(shù)生成工具
org.apache.commons.lang3.RandomUtils
簡單易用垃环,就不多說。

反射

三個常見工具類:

  • org.apache.commons.lang3.ClassUtils
  • org.apache.commons.lang3.reflect.FieldUtils
  • org.apache.commons.lang3.reflect.MethodUtils

通過ClassUtils可以獲取所有接口返敬、所有的父類等類定義相關(guān)的操作遂庄,也可以獲取數(shù)組每個元素類型,例如:Class<?>[] toClass(final Object... array)救赐。
通過FieldUtils可以方便的屬性操作:查涧团、讀、寫经磅;
通過MethodUtils可以方便方法操作:獲取泌绣、調(diào)用。
通過工具類预厌,可以饒過JDK方法阿迈、字段反射操作的限制。具體可以參考:JAVA反射轧叽,用好就這點東西

如果需要遍歷所有字段或方法進行某種操作苗沧,可以使用:
org.springframework.util.ReflectionUtils,例如:

doWithMethods(Class<?> clazz, MethodCallback mc)
doWithLocalMethods(Class<?> clazz, MethodCallback mc) 
doWithMethods(Class<?> clazz, MethodCallback mc, MethodFilter mf) 
doWithFields(Class<?> clazz, FieldCallback fc) 
doWithLocalFields(Class<?> clazz, FieldCallback fc)
doWithFields(Class<?> clazz, FieldCallback fc, FieldFilter ff)

ReflectionUtils這個類我在RPC中動態(tài)代理中有使用炭晒。

判斷訪問權(quán)限待逞,可以使用java.lang.reflect.Modifier,當(dāng)然你可能永遠不會使用网严。

獲取Springbean的目標(biāo)對象识樱,可以使用:org.springframework.aop.framework.AopProxyUtils.ultimateTargetClass()
主要功能:如果是cglib生成的代理類,則返回父類。

注解操作

獲取注解怜庸,判斷是否有注解等当犯,使用
org.springframework.core.annotation.AnnotationUtils

序列化工具

org.apache.commons.lang3.SerializationUtils,例如:

byte[] bytes = SerializationUtils.serialize(new Integer(1));
System.out.println(SerializationUtils.<Integer>deserialize(bytes)); //1

摘要(簽名)工具類

org.apache.commons.codec.digest.DigestUtils
支持常用的md5/sha1/sha256等等單向散列摘要算法割疾,使用:

DigestUtils.md5("abc"); //900150983cd24fb0d6963f7d28e17f72
DigestUtils.sha256("abc"); //ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

IO操作

主要2個工具類:

  • org.apache.commons.io.IOUtils
  • org.apache.commons.io.FileUtils

IOUtils包括便捷的流操作嚎卫,包括:優(yōu)雅關(guān)閉流closeQuietly(),當(dāng)然jdk7后使用try-with-resource自動關(guān)閉宏榕、復(fù)制拓诸、轉(zhuǎn)化、讀取担扑、寫入恰响、常量(換號符、路徑分割符等)等等涌献。
FileUtils提供文件便捷操作胚宦,文件夾遍歷、文件復(fù)制讀寫燕垃、轉(zhuǎn)換等等枢劝。
例如:

FileUtils.readFileToString(new File("***"), Charsets.UTF_8)
IOUtils.toString(java.io.InputStream,java.nio.charset.Charse)
IOUtils.copy(final Reader input, final Writer output)
......

總之,你幾乎以后都不需要自己實例化InputStream卜壕、Reader等jdk底層實現(xiàn)了您旁。

集合操作

集合,可謂亂象叢生轴捎。各種同質(zhì)化工具類以及guava鹤盒,common包等提供的特殊集合。其實你要記住的只是常用操作而已侦副,亂七八糟的東西私下研究研究侦锯、漲漲見識就行了。

1. 判空
org.apache.commons.collections.CollectionUtils.isEmpty()
org.apache.commons.collections.MapUtils.isEmpty()

2. 常量
java.util.Collections.EMPTY_LIST
java.util.Collections.EMPTY_MAP
java.util.Collections.EMPTY_SET
注意:正常情況秦驯,返回值應(yīng)該是空集合而不是null尺碰。

3. 單元素轉(zhuǎn)集合
java.util.Arrays.asList()返回的集合不支持add、remove操作
com.google.common.collect.Lists.newArrayList(E...)
com.google.common.collect.Sets.newHashSet(E...)

4. 基本類型數(shù)組轉(zhuǎn)集合
com.google.common.primitives.Ints.asList(int... )
com.google.common.primitives.Longs.asList(long...)
......
不要用java.util.Arrays.asList,它會認為數(shù)組是一個對象译隘。

5. 常用操作
java.util.Collections.sort(java.util.List<T>, java.util.Comparator<? super T>)//排序
org.apache.commons.collections.ListUtils.retainAll(Collection collection, Collection retain)//保留交集
org.apache.commons.collections.ListUtils.removeAll(Collection collection, Collection remove) //去掉相交
com.google.common.collect.Lists.partition() 或者
org.apache.commons.collections4.ListUtils.partition() //分割大集合亲桥,并發(fā)處理時很常用
com.google.common.collect.Lists.transform()
//懶式數(shù)據(jù)轉(zhuǎn)換,正真get數(shù)據(jù)時才會轉(zhuǎn)換固耘。
java.util.Collections.max(java.util.Collection<? extends T>) //最大
java.util.Collections.min(java.util.Collection<? extends T>)//最小

先就寫到這里题篷,已經(jīng)比較多了,以后用到在補充厅目,如果哪位同學(xué)給點補充就再好不過了悼凑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末偿枕,一起剝皮案震驚了整個濱河市璧瞬,隨后出現(xiàn)的幾起案子户辫,更是在濱河造成了極大的恐慌,老刑警劉巖嗤锉,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渔欢,死亡現(xiàn)場離奇詭異,居然都是意外死亡瘟忱,警方通過查閱死者的電腦和手機奥额,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來访诱,“玉大人垫挨,你說我怎么就攤上這事触菜【爬疲” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵涡相,是天一觀的道長哲泊。 經(jīng)常有香客問我,道長催蝗,這世上最難降的妖魔是什么切威? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮丙号,結(jié)果婚禮上先朦,老公的妹妹穿的比我還像新娘。我一直安慰自己犬缨,他們只是感情好喳魏,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遍尺,像睡著了一般截酷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乾戏,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天迂苛,我揣著相機與錄音,去河邊找鬼鼓择。 笑死三幻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呐能。 我是一名探鬼主播念搬,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼抑堡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了朗徊?” 一聲冷哼從身側(cè)響起首妖,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎爷恳,沒想到半個月后有缆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡温亲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年棚壁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栈虚。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡袖外,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出魂务,到底是詐尸還是另有隱情曼验,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布头镊,位于F島的核電站蚣驼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏相艇。R本人自食惡果不足惜颖杏,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坛芽。 院中可真熱鬧留储,春花似錦、人聲如沸咙轩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽活喊。三九已至丐膝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钾菊,已是汗流浹背帅矗。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留煞烫,地道東北人浑此。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像滞详,于是被迫代替她去往敵國和親凛俱。 傳聞我的和親對象是個殘疾皇子紊馏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345