commons-collections

发布于 2022-09-26  28.44k 次阅读


1. commons-collections的介绍

背景:commons-collections是Apache下的项目,曾隶属于jakarta项目,属于Commons一系列工具包的一环

Apache Commons提供了一系列的开发工具包:

  1. Commons-Codec:提供一些通用的编码解码算法。包括语音编码器,Hex、Base64及URL encoder等
  2. Commons-BeanUtils:提供对Java反射和自省的API包装
  3. Commons-FileUpload:提供对Servlet的高性能文件上传能力
  4. Commons-IO:封装原生Java IO的IO工具集
  5. Commons-HttpClient:提供Http协议客户端的框架
  6. Commons-Collections:封装增强java原生Collection集合的工具类
  7. Commons-Cli:提供针对命令行参数、选项、选项组等API
  8. Commons-DBCP:提供数据库连接池服务
  9. Commons-Logging:封装logging API
  10. Commons-Pool:提供通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实现
  11. Commons-Math:一个轻量级、包含数学和统计组件等
  12. Commons-Net:Net是一个网络工具集,基于NetComponents代码,包含FTP客户端等等
  13. …………………

commons-collections包为Java原生的Collections API提供了封装和增强,对其常用的数据结构操作进行抽象和补充

Apche Commons API文档

Apache Commons的子包及功能:

* org.apache.commons.collections.bag – 实现Bag接口的一组类
* org.apache.commons.collections – CommonsCollections自定义的一组公用的接口和工具类
* org.apache.commons.collections.bidimap – 实现BidiMap系列接口的一组类
* org.apache.commons.collections.buffer – 实现Buffer接口的一组类
* org.apache.commons.collections.collection –实现java.util.Collection接口的一组类
* org.apache.commons.collections.comparators– 实现java.util.Comparator接口的一组类
* org.apache.commons.collections.functors –Commons Collections自定义的一组功能类
* org.apache.commons.collections.iterators – 实现java.util.Iterator接口的一组类
* org.apache.commons.collections.keyvalue – 实现集合和键/值映射相关的一组类
* org.apache.commons.collections.list – 实现java.util.List接口的一组类
* org.apache.commons.collections.map – 实现Map系列接口的一组类
* org.apache.commons.collections.set – 实现Set系列接口的一组类

依赖:

<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.2</version>
</dependency>

2. CollectionUtils集合工具类

CollectionUtils是集合操作的工具类,可以对集合进行交并补的计算等

① 集合的交集/并集/补集/差集的运算:

  • CollectionUtils.union:并集,会去除重复元素
  • CollectionUtils.intersection:交集
  • CollectionUtils.disjunction:补集
  • CollectionUtils.subtract:差集
public class SetOperationTest {

     static List<String> newary = Arrays.asList(new String[]{"smile","beautiful","ways","problem","wallpaper"});
     static List<String> oldary = Arrays.asList(new String[]{"smile","beautiful","yourself","problem","wallpaper"});

    public static void main(String[] args) {

        //1,并集
        System.out.println("并集:"+UnionTest().toString());

        //2,交集
        System.out.println("交集:"+IntersectionText().toString());

        //3,补集
        System.out.println("补集:"+DisjunctionText().toString());

        //3,补集
        System.out.println("差集:"+ SubsractText().toString());
    }

    //1, 交集
    public static List<String> UnionTest(){

       return (List<String>) CollectionUtils.union(newary, oldary);
    }

    //1, 交集
    public static List<String> IntersectionText(){

        return (List<String>) CollectionUtils.intersection(newary, oldary);
    }

    //3,补集
    public static List<String> DisjunctionText(){

        return (List<String>) CollectionUtils.disjunction(newary, oldary);
    }

    //4,差集(newary - oldary)
    public static List<String> SubsractText(){

        return (List<String>) CollectionUtils.subtract(newary, oldary);
    }
}

输出:

并集:[beautiful, ways, problem, wallpaper, yourself, smile]
交集:[beautiful, problem, wallpaper, smile]
补集:[ways, yourself]
差集:[ways]

② 集合间的判断

  • CollectionUtils.isEmpty:判断集合是否为空
  • CollectionUtils.isNotEmpty:判断集合是否不为空
  • CollectionUtils.isEqualCollection:比较两个集合的值是否相等
  • CollectionUtils.containsAny:判断两个集合是否有相同元素
  • CollectionUtils.isSubCollection:集合1是否为集合2的子集
public class OpinionNullTest {

    static List<String> nullary = Arrays.asList(new String[]{null});
    static List<String> ary = Arrays.asList(new String[]{null,"smile","beautiful","yourself","problem","wallpaper"});

    public static void main(String[] args) {
        System.out.println("是否为空集合"+isEmptyTest());
        System.out.println("集合是否不为空"+isNotEmptyTest());
        System.out.println("集合值是否相等"+isEqualCollectionTest());
        System.out.println("两个集合是否有相同元素:"+ContainsAnyTest());
        System.out.println("集合1是否为集合2的子集:"+isSubCollectionTest());

    }
    //1,判断集合是否为空
    public static boolean isEmptyTest(){
        return CollectionUtils.isEmpty(nullary);
    }

    //2,判断集合是否不为空
    public static boolean isNotEmptyTest(){
        return CollectionUtils.isNotEmpty(ary);
    }

    //3,比较两个集合的值是否相等
    public static boolean isEqualCollectionTest(){
        return CollectionUtils.isEqualCollection(ary,ary);
    }

    //4,判断两个集合是否有相同元素
    public static boolean ContainsAnyTest(){
        return CollectionUtils.containsAny(ary,nullary);
    }

    //5,集合1是否为集合2的子集
    public static boolean isSubCollectionTest(){
        return CollectionUtils.isSubCollection(ary,nullary);
    }
}

输出:

是否为空集合false
集合是否不为空true
集合值是否相等true
两个集合是否有相同元素:true
集合1是否为集合2的子集:false

③ 集合其他操作

  •  CollectionUtils.unmodifiableCollection:得到一个镜像集合,不允许修改,否则报错
  • CollectionUtils.getCardinalityMap:统计集合中各元素出现的次数(返回值为Map集合)
  • CollectionUtils.cardinality:某元素在集合中出现的次数
  • CollectionUtils.removeAll:删除集合中的子集合
public class CollectionFunctionTest {

    static List<String> ary = Arrays.asList(new String[]{"smile","beautiful","yourself","problem","wallpaper"});
    static List<String> ary1 = Arrays.asList(new String[]{"problem","wallpaper"});
    public static void main(String[] args) {


        //1,得到一个镜像集合,不允许修改,否则报错
        System.out.println("镜像集合:"+CollectionUtils.unmodifiableCollection(ary).toString());


        //2,统计集合中各元素出现的次数(返回值为Map集合)
        System.out.println("元素出现的次数:"+CollectionUtils.getCardinalityMap(ary).toString());


        //3,某元素在集合中出现的次数
        System.out.println("元素出现的次数:"+CollectionUtils.cardinality("smile",ary));


        //4,删除集合中的子集合
        System.out.println("删除集合中的子集合:"+CollectionUtils.removeAll(ary, ary1));

    }}

输出:

镜像集合:[smile, beautiful, yourself, problem, wallpaper]
元素出现的次数:{beautiful=1, problem=1, wallpaper=1, yourself=1, smile=1}
元素出现的次数:1
删除集合中的子集合:[smile, beautiful, yourself]

3. MapUtils工具类

① 值的获取

  • getBoolean: 从Map中获取 Boolean, 其重载方法有三个参数, 表示如果转换失败则使用默认值
  • getBooleanValue: 从Map中获取 boolean, 其重载方法有三个参数, 表示如果转换失败则使用默认值
  • getDouble:从Map中获取 Double, 其重载方法有三个参数, 表示如果转换失败则使用默认值
  • getDoubleValue:从Map中获取 double, 其重载方法有三个参数, 表示如果转换失败则使用默认值
  • getFloat:从Map中获取 Float, 其重载方法有三个参数, 表示如果转换失败则使用默认值
  • getFloatValue:从Map中获取 float, 其重载方法有三个参数, 表示如果转换失败则使用默认值
  • getInteger:从Map中获取 Integer, 其重载方法有三个参数, 表示如果转换失败则使用默认值
  • getIntegerValue:从Map中获取 int, 其重载方法有三个参数, 表示如果转换失败则使用默认值
  • getLong:从Map中获取 Long, 其重载方法有三个参数, 表示如果转换失败则使用默认值
  • getLongValue:从Map中获取 long, 其重载方法有三个参数, 表示如果转换失败则使用默认值
  • getString:从Map中获取 String, 其重载方法有三个参数, 表示如果转换失败则使用默认值
  • getMap:获取Map类型的值
public static void main(String[] args) {

    HashMap<Integer,String> map = getHashMap();

    //获取值,参1:集合 参2:key值 参3:默认值
    System.out.println(MapUtils.getString(map, 1, "wq"));

}

public static HashMap getHashMap(){

    HashMap<Integer,String> map = new HashMap<>();
    map.put(1,"smile");
    map.put(2,"dispirited");
    map.put(3,"king");
    return map;
}

② 其他操作

  • isNotEmpty ( ) 是否不为空
  • isEmpty ( ) 是否为空
  • unmodifiableMap 获取一个不可以修改的Map(不能新增或删除)
  • unmodifiableSortedMap 获取一个不可以修改的有序的Map(不能新增或删除)
  • fixedSizeMap 获取一个固定长度的map
  • multiValueMap 获取一个多值的map(即一个key可以对应多个value值)
  • invertMap 返回一个key与value对调的map
  • predicatedMap() 返回一个满足predicate条件的map
  • lazyMap 返回一个lazy的map(值在需要的时候可以创建)

……………………

还有很多其他的类,具体可以在有业务需求中探索发现


路漫漫其修远兮,吾将上下而求索