【小家java】Java之Apache Commons-Collections4使用精讲(Bag、Map、List、Set全覆盖)(下)

简介: 【小家java】Java之Apache Commons-Collections4使用精讲(Bag、Map、List、Set全覆盖)(下)

Map工具类:MapUtils


这里汇聚了一些操作Map的方法,介绍一些觉得比较实用的方法:

  • emptyIfNull
    之前我们经常会这么写(不返回null的Map):
 if (map != null) {
            return Collections.emptyMap();
        }


现在可以直接这么来了:

return MapUtils.emptyIfNull(map);


  • fixedSizeMap、fixedSizeSortedMap


IterableMap<String, String> itMap = MapUtils.fixedSizeMap(map);


可以一键吧一个Map定长掉,放置一些误操作


  • invertMap
    对调key和value的值
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("key1", "value1");
        map.put("key2", "value2");
        map.put("key3", "value3");
        //fanzhuan反转  对调key和value
        Map<String, String> invertMap = MapUtils.invertMap(map);
        System.out.println(map); //{key1=value1, key2=value2, key3=value3}
        System.out.println(invertMap); //{value2=key2, value1=key1, value3=key3}
    }


  • iterableMap
    构建一个iterableMap,然后方便遍历、删除等等
    之前我们需要遍历删除Map中元素,需要



// 然后在根据key的迭代器去删除
map.entrySet().iterator();


现在方便了


    public static void main(String[] args) {
       Map<String, String> map = new HashMap<>();
       map.put("key1", "value1");
       map.put("key2", "value2");
       map.put("key3", "value3");
       IterableMap<String, String> iterableMap = MapUtils.iterableMap(map);
       MapIterator<String, String> it = iterableMap.mapIterator();
       while (it.hasNext()){
           it.next();
           String key = it.getKey();
           if(key.equals("key2")){
               it.remove();
           }
       }
       System.out.println(iterableMap); //{key1=value1, key3=value3}
       //我们发现这样对itMap进行删除  原来的Map也会达到同样的效果
       System.out.println(map); // {key1=value1, key3=value3}
   }


  • populateMap
    能很方便向Map里面放值,并且支持定制化key和value,还是挺好用的


    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("key1", "value1");
        //序列化 根据提供的values,按照后面规则把key都生成出来然后直接放进去
        MapUtils.populateMap(map, Arrays.asList("a", "b", "c"), e -> "key-" + e);
        System.out.println(map); //{key1=value1, key-a=a, key-c=c, key-b=b}
        //可以在上面的理论上 对value进行进一步操作  不能采用map.values() 否则由于并发修改异常
        // MapUtils.populateMap(map, map.values(), e -> e, e -> "value-" + e); //java.util.ConcurrentModificationException
        MapUtils.populateMap(map, Arrays.asList("a", "b", "c"), e -> e, e -> "value-" + e); //java.util.ConcurrentModificationException
        System.out.println(map); //{key1=value1, key-a=a, a=value-a, b=value-b, c=value-c, key-c=c, key-b=b}
    }


同时该方法也提供了对MutiMap的支持


  • synchronizedMap、unmodifiableMap


  • toProperties:可以有非常简便的转化


    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("key1", "value1");
        map.put("key2", "value2");
        map.put("key3", "value2");
        Properties properties = MapUtils.toProperties(map);
        System.out.println(properties); //{key3=value2, key2=value2, key1=value1}
    }


SetUtils

difference:找到两个set之间的不同元素

返回的是第一个set里有的,但是第二个set里没有的元素们


    public static void main(String[] args) {
        Set<String> set1 = new HashSet<String>(){{
            add("a");
            add("b");
            add("c");
        }};
        Set<String> set2 = new HashSet<String>(){{
            add("c");
            add("d");
            add("e");
        }};
        SetUtils.SetView<String> difference = SetUtils.difference(set1, set2);
        System.out.println(difference); //[a,b]
        Set<String> strings = difference.toSet();
        System.out.println(strings); //[a,b]
    }


disjunction:和上面方法类似,但是属于加强版


会返回第一个set和第二个有差异的所有元素们


    public static void main(String[] args) {
        Set<String> set1 = new HashSet<String>(){{
            add("a");
            add("b");
            add("c");
        }};
        Set<String> set2 = new HashSet<String>(){{
            add("c");
            add("d");
            add("e");
        }};
        SetUtils.SetView<String> difference = SetUtils.disjunction(set1, set2);
        System.out.println(difference); //[a, b, d, e]
        Set<String> strings = difference.toSet();
        System.out.println(strings); //[a, b, d, e]
    }


emptyIfNull:见上MapUtils类似方法


newIdentityHashSet:可以实例化出一个newIdentityHashSet


至于它和HashSet的区别在哪里?若需要请参考我的博文:

【小家java】Java中IdentityHashMap使用详解—允许key重复(阐述和HashMap的区别)

他们的区别和HashMap的区别是一样的,请参阅


isEqualSet:


两个set里面的元素是否都一样(长度一样、元素一样),有时候判断还是非常有用的


union:合并两个set,生成一个新的set


    public static void main(String[] args) {
        Set<String> set1 = new HashSet<String>(){{
            add("a");
            add("b");
            add("c");
        }};
        Set<String> set2 = new HashSet<String>(){{
            add("c");
            add("d");
            add("e");
        }};
        SetUtils.SetView<String> union = SetUtils.union(set1, set2);
        System.out.println(union); //[a, b, c, d, e]
    }


类似于addAll的效果,但是它的好处是生成了一个新的set,对原来的set没有污染。


ListUtils


emptyIfNull:同上


defaultIfNull:可以在为null的时候,自己给个默认值返回


fixedSizeList:不解释


hashCodeForList:给List吧它的HashCode计算出来


intersection:取交集,生成一个新的List


    public static void main(String[] args) {
        List<String> list1 = new ArrayList<String>(){{
            add("a");
            add("b");
            add("c");
        }};
        List<String> list2 = new ArrayList<String>(){{
            add("c");
            add("d");
            add("e");
        }};
        //取出交集 并且返回一个新的List
        List<String> intersection = ListUtils.intersection(list1, list2);
        System.out.println(intersection); //[c]
        //这个方法也能取出交集的效果 但是会直接改变list1里面的元素  list2不变
        list1.retainAll(list2);
        System.out.println(list1); // [c]
        System.out.println(list2); //[c, d, e]
    }


partition:切割 把一个大的List切割成多个List 非常好用


常用场景:有10000个id需要批量查询,我们可以切割一下,200个发一次请求去查询一次,还可以开多个线程,用闭锁去弄


    public static void main(String[] args) {
        List<String> list1 = new ArrayList<String>(){{
            add("a");
            add("b");
            add("c");
            add("a");
            add("b");
            add("c");
            add("a");
            add("b");
            add("c");
        }};
        List<List<String>> partition = ListUtils.partition(list1, 4);
        System.out.println(partition); //[[a, b, c, a], [b, c, a, b], [c]]
    }


subtract:相当于做减法,用第一个List除去第二个list里含有的元素 ,然后生成一个新的list


    public static void main(String[] args) {
        List<String> list1 = new ArrayList<String>(){{
            add("a");
            add("b");
            add("c");
        }};
        List<String> list2 = new ArrayList<String>(){{
            add("c");
            add("d");
            add("e");
        }};
        //取出交集 并且返回一个新的List
        List<String> subtract = ListUtils.subtract(list1, list2);
        System.out.println(subtract); //[a,b]
    }

sum:把两个List的元素相加起来 注意:相同的元素不会加两次 生成一个新的List


    public static void main(String[] args) {
        List<String> list1 = new ArrayList<String>(){{
            add("a");
            add("b");
            add("c");
        }};
        List<String> list2 = new ArrayList<String>(){{
            add("c");
            add("c");
            add("c");
            add("d");
            add("e");
        }};
        //取出交集 并且返回一个新的List
        List<String> sumlist = ListUtils.sum(list1, list2);
        System.out.println(sumlist); //[a, b, c, d, e]
    }


此方法注意了,有相加的功能和去重的功能,很多场景还是很好用的


union:这个和sum方法不一样,它不带去重的功能。内部调用的addAll方法,但是生成一个新的List


例子:略

关于springframework的CollectionUtils


若你在上面没有找到操作集合的相关方法,可议参照Spring提供的这个工具类。API截图如下,就不详细分析了


image.png


总结


工欲善其事必先利其器,磨刀不误砍柴工。


希望整理的一些常用工具类、工具方法能够帮助到大家。

相关文章
|
24天前
|
算法
你对Collection中Set、List、Map理解?
你对Collection中Set、List、Map理解?
57 18
你对Collection中Set、List、Map理解?
|
17天前
|
存储 缓存 安全
只会“有序无序”?面试官嫌弃的List、Set、Map回答!
小米,一位热衷于技术分享的程序员,通过与朋友小林的对话,详细解析了Java面试中常见的List、Set、Map三者之间的区别,不仅涵盖了它们的基本特性,还深入探讨了各自的实现原理及应用场景,帮助面试者更好地准备相关问题。
54 20
|
2月前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
69 5
|
2月前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
46 3
|
2月前
|
Java 程序员
Java|List.subList 踩坑小记
不应该仅凭印象和猜测,就开始使用一个方法,至少花一分钟认真读完它的官方注释文档。
29 1
|
3月前
|
IDE Java 分布式数据库
Apache HBase 落地JAVA 实战
Apache HBase 落地 Java 实战主要涉及使用 Java API 来操作 HBase 数据库,包括表的创建、删除、数据的插入、查询等操作。以下是一个基于 Java 的 HBase 实战指南,包括关键步骤和示例代码。
243 23
|
2月前
|
分布式计算 Java 大数据
大数据-147 Apache Kudu 常用 Java API 增删改查
大数据-147 Apache Kudu 常用 Java API 增删改查
40 1
|
3月前
|
算法
你对Collection中Set、List、Map理解?
你对Collection中Set、List、Map理解?
43 5
|
2月前
|
Java Apache
Apache POI java对excel表格进行操作(读、写) 有代码!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
71 0
|
3月前
|
Java API 开发者
代码小妙招:用Java轻松获取List交集数据
在Java中获取两个 `List`的交集可以通过 `retainAll`方法和Java 8引入的流操作来实现。使用 `retainAll`方法更为直接,但会修改原始 `List`的内容。而使用流则提供了不修改原始 `List`、更为灵活的处理方式。开发者可以根据具体的需求和场景,选择最适合的方法来实现。了解和掌握这些方法,能够帮助开发者在实际开发中更高效地处理集合相关的问题。
110 1

推荐镜像

更多