本文介绍: 本篇结合代码示例介绍Apache集合类&字符串工具包中实用的API,很多sonar中的NPE问题可以用Apache工具包解决代码的可读性也会得到提升;

本篇介绍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已经帮我们做了非空判断,无需自己写非空判断

示例

    @Test
    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 &amp;&amp; !emptyMap.isEmpty());
    }

Map取值MapUtils.getIntValue之类,帮助完成Map取value时的类型转换,无需自己写XX.valueOf(xx)或类型强转;

示例

    @Test
    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和空集合;

示例:

    @Test
    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,判断元素是否一致,这个方法很实用,自己少写很多代码

示例:

    @Test
    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集合;

示例:

    @Test
    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的交集;

示例:

    @Test
    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.isNotEmptynull及空字符串都会判为true;

非空串及空格判断StringUtils.isNotBlanknull及空字符串、全空格都会判为true;

示例:

    @Test
    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 = "nt";

        // 字符串非空串判断 空格和控制符都不算空串
        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,含判空,将指定字符串的字符倒序输出;

示例:

    @Test
    public void testStringUtils1() {
        String nullStr1 = null;
        String str1 = " a b nt c n";
        String str2 = "abc nt 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,这里不再展开一一介绍,有兴趣可以自己去看源码学习

原文地址:https://blog.csdn.net/minghao0508/article/details/127630069

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_30324.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注