代码——Apache集合类和amp;字符串工具包实用的API
本篇介绍Apache集合类&字符串工具包中实用的API,很多sonar中的NPE问题都可以用Apache工具包来解决,代码的可读性也会得到提升;
Maven依赖
-
<dependency>
-
<groupId>commons-collections</groupId>
-
<artifactId>commons-collections4</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.apache.commons</groupId>
-
<artifactId>commons-lang3</artifactId>
-
</dependency>
1. MapUtils
Map判空:MapUtils.isNotEmpty,API已经帮我们做了非空判断,无需自己写非空判断;
示例:
-
-
public void testMapUtils() {
-
final HashMap<Object, Object> emptyMap = Maps.newHashMap();
-
final HashMap<Object, Object> nullMap = null;
-
-
System.out.println(MapUtils.isNotEmpty(emptyMap));
-
System.out.println(MapUtils.isNotEmpty(emptyMap));
-
// MapUtils.isNotEmpty等价于下面的写法 直接使用java.util.HashMap#isEmpty可能会导致NPE
-
System.out.println(nullMap != null && !emptyMap.isEmpty());
-
}
Map取值:MapUtils.getIntValue之类,帮助完成Map取value时的类型转换,无需自己写XX.valueOf(xx)或类型强转;
示例:
-
-
public void testMapUtils2() {
-
final HashMap<String, Object> map = Maps.newHashMap();
-
map.put("int", 123);
-
map.put("long", 99999L);
-
map.put("string", "hello");
-
map.put("boolean", Boolean.TRUE);
-
map.put("booleanInt", 0);
-
-
final int anInt = MapUtils.getIntValue(map, "int", 0);
-
// MapUtils.getIntValue等价于下面的写法 且类型强转可能抛出异常
-
int intValue = map.get("int") == null ? 0 : (Integer) map.get("int");
-
-
System.out.println(anInt); // [输出]123
-
System.out.println(intValue); // [输出]123
-
-
final boolean booleanValue = MapUtils.getBooleanValue(map, "int");
-
final boolean booleanIntValue = MapUtils.getBooleanValue(map, "booleanInt");
-
// 注意getBoolean的逻辑:若为Boolean型/boolean字符串则直接转换,否则判断是否数值型——不等于0返回true,等于0返回false;都不满足则返回默认的false
-
System.out.println(map.get("int") "的getBooleanValue的结果: " booleanValue); // [输出]123的getBooleanValue的结果: true
-
System.out.println(map.get("booleanInt") "的getBooleanValue的结果: " booleanIntValue); // [输出]0的getBooleanValue的结果: false
-
}
需要注意的是,类型转换中,尽管MapUtils封装了对类型转换异常的捕获以及赋值默认值,还需要注意特殊类型Boolean的取值逻辑,如果强行对数值型取boolean,会有判断非零的逻辑,见上面的例子;
2. CollectionUtils
集合判空:CollectionUtils.isNotEmpty,最常用的就是List和Set,实际上实现了Collection接口的集合类都可以判断,包含判null和空集合;
示例:
-
-
public void testCollectionUtils() {
-
final List<String> list = Lists.newArrayList("a","a","b","c");
-
final Set<String> set = Sets.newHashSet(list);
-
final List<String> emptyList = Collections.emptyList();
-
-
System.out.println(CollectionUtils.isNotEmpty(list)); // [输出]true
-
System.out.println(CollectionUtils.isNotEmpty(set)); // [输出]true
-
System.out.println(CollectionUtils.isNotEmpty(emptyList)); // [输出]false
-
}
集合相等判断:CollectionUtils.isEqualCollection,对于List或Set,判断元素集是否一致,这个方法很实用,自己少写很多代码;
示例:
-
-
public void testCollectionUtils1() {
-
final HashSet<String> setA = Sets.newHashSet();
-
final HashSet<String> setA1 = Sets.newHashSet();
-
final HashSet<String> setB = Sets.newHashSet();
-
-
setA.add("a");
-
setA.add("b");
-
setA.add("c");
-
-
setA1.add("b");
-
setA1.add("a");
-
setA1.add("c");
-
-
setB.add("b");
-
setB.add("c");
-
setB.add("d");
-
-
final ArrayList<String> listA = Lists.newArrayList("a", "b", "c");
-
final ArrayList<String> listA1 = Lists.newArrayList("c", "a", "b");
-
-
System.out.println(JSON.toJSONString(CollectionUtils.isEqualCollection(setA, setB))); // [输出]false
-
System.out.println(JSON.toJSONString(CollectionUtils.isEqualCollection(setA, setA1))); // [输出]true
-
// 集合相等判断与元素顺序无关
-
System.out.println(JSON.toJSONString(CollectionUtils.isEqualCollection(listA, listA1))); // [输出]true
-
// 集合相等判断与元素数量有关
-
listA1.add("a");
-
System.out.println(JSON.toJSONString(CollectionUtils.isEqualCollection(listA, listA1))); // [输出]false
-
// 集合相等判断可以跨类型 如List与Set
-
System.out.println(JSON.toJSONString(CollectionUtils.isEqualCollection(listA, setA))); // [输出]true
-
-
}
是否子集判断:CollectionUtils.isSubCollection,对于List或Set,判断A是否B的子集,这个方法也很实用;子集的定义:若A是B的子集,则A中每个元素的数量都小于或等于该元素在B中的数量; 还有一个方法CollectionUtils.isProperSubCollection,判断A是否B的严格子集,即在A是B的子集的基础上,要求集合A的总元素数量必须小于B集合;
示例:
-
-
public void testCollectionUtils1() {
-
-
final HashSet<String> setSub = Sets.newHashSet();
-
final HashSet<String> setAll = Sets.newHashSet();
-
setSub.add("a");setSub.add("b");setSub.add("c");
-
setAll.add("a");setAll.add("b");setAll.add("c");setAll.add("d");
-
-
// 子集的定义是:若A是B的子集,则A中每个元素的数量都小于等于该元素在B中的数量;
-
System.out.println(JSON.toJSONString("是否子集:" CollectionUtils.isSubCollection(setSub, setAll)));
-
// 严格子集的定义是:在子集的基础上,A的元素数量要小于B;
-
System.out.println(JSON.toJSONString("是否严格子集:" CollectionUtils.isSubCollection(setSub, setSub)));
-
System.out.println(JSON.toJSONString("是否严格子集:" CollectionUtils.isSubCollection(setSub, setAll)));
-
// 若A中某元素在B中不存在,则必不是子集
-
setSub.add("e");
-
System.out.println(JSON.toJSONString("是否子集:" CollectionUtils.isSubCollection(setSub, setAll)));
-
// 子集判断可以跨类型 如List与Set
-
final ArrayList<String> listSub = Lists.newArrayList("a", "b");
-
System.out.println(JSON.toJSONString("是否子集:" CollectionUtils.isSubCollection(listSub, setAll)));
-
listSub.add("a");
-
System.out.println(JSON.toJSONString("是否子集:" CollectionUtils.isSubCollection(listSub, setAll)));
-
-
}
差集:CollectionUtils.subtract,集合A相比集合B,多出来的元素;
交集:CollectionUtils.intersection,集合A和集合B的交集;
示例:
-
-
public void testCollectionUtils1() {
-
final HashSet<String> setA = Sets.newHashSet();
-
final HashSet<String> setB = Sets.newHashSet();
-
-
setA.add("a");
-
setA.add("b");
-
setA.add("c");
-
-
setB.add("b");
-
setB.add("c");
-
setB.add("d");
-
-
final ArrayList<String> listA = Lists.newArrayList("a", "b", "c");
-
final ArrayList<String> listB = Lists.newArrayList("c", "a", "b", "e");
-
-
// 差集-A比B多的元素
-
System.out.println(JSON.toJSONString(CollectionUtils.subtract(setA, setB))); // [输出] ["a"]
-
// 差集-B比A多的元素
-
System.out.println(JSON.toJSONString(CollectionUtils.subtract(setB, setA))); // [输出] ["d"]
-
-
System.out.println(JSON.toJSONString(CollectionUtils.subtract(listB, listA))); // [输出] ["e"]
-
System.out.println(JSON.toJSONString(CollectionUtils.subtract(listA, listB))); // [输出] []
-
-
// A与B的交集
-
System.out.println(JSON.toJSONString(CollectionUtils.intersection(setB, setA))); // [输出] ["b","c"]
-
}
3. StringUtils
字符串相等:StringUtils.equals,含判空逻辑,避免使用 == 或 equal() 导致的NPE问题,非常实用;
非空串判断:StringUtils.isNotEmpty,null及空字符串都会判为true;
非空串及空格判断:StringUtils.isNotBlank,null及空字符串、全空格都会判为true;
示例:
-
-
public void testStringUtils() {
-
String nullStr1 = null;
-
String nullStr2 = null;
-
String strA = "A";
-
String strB = "B";
-
-
// 字符串等值判断 含null值判断
-
System.out.println(StringUtils.equals(nullStr1, nullStr2)); // [输出]true
-
System.out.println(StringUtils.equals(strA, nullStr2)); // [输出]false
-
System.out.println(StringUtils.equals(strA, strB)); // [输出]false
-
-
String emptyStr = "";
-
String blankStr1 = " ";
-
String blankStr2 = "\n\t";
-
-
// 字符串非空串判断 空格和控制符都不算空串
-
System.out.println(StringUtils.isNotEmpty(nullStr1)); // [输出]false
-
System.out.println(StringUtils.isNotEmpty(emptyStr)); // [输出]false
-
System.out.println(StringUtils.isNotEmpty(blankStr1)); // [输出]true
-
System.out.println(StringUtils.isNotEmpty(blankStr2)); // [输出]true
-
-
// 字符串非空串及空格判断 空格和控制符都满足过滤条件
-
System.out.println(StringUtils.isNotBlank(nullStr1)); // [输出]false
-
System.out.println(StringUtils.isNotBlank(emptyStr)); // [输出]false
-
System.out.println(StringUtils.isNotBlank(blankStr1)); // [输出]false
-
System.out.println(StringUtils.isNotBlank(blankStr2)); // [输出]false
-
}
去除字符串首尾的控制符:StringUtils.trim,含判空,无需调用可能导致NPE的String#trim;
去除字符串中所有的空白符:StringUtils.isNotBlank,含判空,无需调用可能导致NPE的String#replaceAll;
字符串简单反转:StringUtils.reverse,含判空,将指定字符串的字符倒序输出;
示例:
-
-
public void testStringUtils1() {
-
String nullStr1 = null;
-
String str1 = " a b \n\t c \n";
-
String str2 = "abc \n\t efg";
-
-
// 去除首尾空串和控制符
-
System.out.println(str1);
-
System.out.println(StringUtils.trim(str1));
-
// 兼容null
-
System.out.println(nullStr1);
-
System.out.println(StringUtils.trim(nullStr1)); // 输出null,无需自己做判空逻辑
-
/* System.out.println(nullStr1.trim()); 会产生NPE*/
-
-
// 去除全部空串和控制符
-
System.out.println(str1);
-
System.out.println(StringUtils.deleteWhitespace(str1));
-
// 兼容null
-
System.out.println(nullStr1);
-
System.out.println(StringUtils.deleteWhitespace(nullStr1)); // 输出null,无需自己做判空逻辑
-
-
// 字符反转且控制符也会反转
-
System.out.println(str2);
-
System.out.println(StringUtils.reverse(str2));
-
// 兼容null
-
System.out.println(nullStr1);
-
System.out.println(StringUtils.reverse(nullStr1)); // 输出null,无需自己做判空逻辑
-
}
本文仅介绍使用过的认为常用的API,Apache工具包中还有一些功能更强大的API,这里不再展开一个一个地介绍,有兴趣可以自己去看源码学习;
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhghahee
-
Linux服务器搭建----Web服务器apache
-
解决:Failed to execute goal org.apache.tomcat.maven:tomcat7-maven-plugin:2....Could not star
-
javax.servlet.ServletException: java.sql.SQLException: The url cannot be null和java.sql.SQLException错
-
2022红帽企业版网络配置--centos7配置DHCP DNS绑定域名 FTP HTTP(apache) nginx samba
-
org.apache.ibatis.builder.BuilderException: Error creating document instance.
-
分布式计算技术下Impala、Apache Flink、星环Sliphotoshoptream
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13