使用大眾的語言,交流才會有默契丈咐。寫代碼亦如此瑞眼!不要亂造輪子,積累輪子棵逊,搞懂輪子伤疙,最終站在巨人的肩上,才是正途辆影。
字符串操作
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é)給點補充就再好不過了悼凑。