Bootstrap

探索 Apache Commons Collections 4:Java 集合框架的强大扩展

在 Java 开发中,集合框架是处理数据的核心工具。然而,标准 Java 集合框架虽然功能强大,但在某些场景下仍显得不够灵活。Apache Commons Collections 4(以下简称 commons-collections4)作为一个强大的工具库,为开发者提供了丰富的实用工具类和扩展集合类型,极大地增强了 Java 集合框架的功能。下面将深入探讨 commons-collections4 的核心功能,并通过实际示例展示其强大的功能。

1. 什么是 Apache Commons Collections 4?

commons-collections4 是 Apache Commons 项目的一部分,旨在为 Java 标准集合框架提供额外的功能和扩展。它包含了许多实用的工具类和集合类型,涵盖了集合操作、集合转换、集合过滤、集合排序等多个方面。通过使用 commons-collections4,开发者可以更高效地处理集合数据,减少重复代码的编写,提高代码的可读性和可维护性。

2. 引入依赖

首先,你需要在你的项目中引入 Apache Commons Collections 4 库。如果你使用 Maven 构建项目,可以在 pom.xml 文件中添加以下依赖:

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>

在这里插入图片描述

3. 核心功能概览

3.1 集合工具类

CollectionUtilscommons-collections4 中最常用的工具类之一。它提供了丰富的集合操作方法,例如:

  • 集合判空isEmptyisNotEmpty
  • 集合合并unionintersectiondisjunction
  • 集合过滤selectfilter
  • 集合转换collect
3.1.1 集合判空

在处理集合时,我们经常需要判断集合是否为空。CollectionUtils提供了两个非常方便的方法:isEmpty 和 isNotEmpty。

import org.apache.commons.collections4.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

public class CollectionUtils01 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();

        if (CollectionUtils.isEmpty(list)) {
            System.out.println("List is empty");
        }

        if (CollectionUtils.isNotEmpty(list)) {
            System.out.println("List is not empty");
        }
    }
}

在这里插入图片描述

3.1.2 集合合并
3.1.2.1 union

union 方法用于计算两个集合的并集。

import org.apache.commons.collections4.CollectionUtils;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;

public class CollectionUtilsUnion {
    public static void main(String[] args) {
        List<Integer> list1 = Arrays.asList(1, 2, 3);
        List<Integer> list2 = Arrays.asList(3, 4, 5);

        Collection<Integer> union = CollectionUtils.union(list1, list2);
        System.out.println(union); // 输出: [1, 2, 3, 4, 5]
    }
}

在这里插入图片描述

3.1.2.2 intersection

intersection 方法用于计算两个集合的交集。

import org.apache.commons.collections4.CollectionUtils;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;

public class CollectionUtilsIntersection {
    public static void main(String[] args) {
        List<Integer> list1 = Arrays.asList(1, 2, 3);
        List<Integer> list2 = Arrays.asList(3, 4, 5);

        Collection<Integer> intersection = CollectionUtils.intersection(list1, list2);
        System.out.println(intersection); // 输出: [3]
    }
}

在这里插入图片描述

3.1.2.3 subtract

subtract 方法用于计算两个集合的差集。

import org.apache.commons.collections4.CollectionUtils;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;

public class CollectionUtilsSubtract {
    public static void main(String[] args) {
        List<Integer> list1 = Arrays.asList(1, 2, 3);
        List<Integer> list2 = Arrays.asList(3, 4, 5);

        Collection<Integer> subtract = CollectionUtils.subtract(list1, list2);
        System.out.println(subtract); // 输出: [1, 2]
    }
}

在这里插入图片描述

3.1.3 集合过滤 selectfilter

selectfilter 方法用于根据指定的条件过滤集合中的元素。

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Predicate;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;

public class CollectionUtils03 {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        Predicate<Integer> isEven = n -> n % 2 == 0;

        Collection<Integer> evenNumbers = CollectionUtils.select(numbers, isEven);
        System.out.println(evenNumbers); // 输出: [2, 4]
    }
}

在这里插入图片描述

3.1.4 集合转换

collect 方法用于将集合中的元素转换为另一种类型。

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Transformer;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;

public class CollectionUtils04 {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
        Transformer<String, Integer> lengthTransformer = String::length;

        Collection<Integer> lengths = CollectionUtils.collect(names, lengthTransformer);
        System.out.println(lengths); // 输出: [5, 3, 7]
    }
}

在这里插入图片描述

3.2 映射(Map)操作

Apache Commons Collections 4库中的MapUtils类为我们提供了一系列实用的工具方法,可以极大地简化映射操作的复杂性。它提供了丰富的映射操作方法,例如:

  • 判断映射是否为空isEmptyisNotEmpty
  • 映射中获取值getIntegergetLonggetDoublegetString
  • 安全添加键值对到映射safeAddToMap
  • 反转映射invertMap
3.2.1 判断映射是否为空

在处理映射时,我们经常需要判断映射是否为空。MapUtils提供了两个非常方便的方法:isEmptyisNotEmpty

import org.apache.commons.collections4.MapUtils;

import java.util.HashMap;
import java.util.Map;

public class MapUtils01 {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();

        if (MapUtils.isEmpty(map)) {
            System.out.println("Map is empty");
        }

        if (MapUtils.isNotEmpty(map)) {
            System.out.println("Map is not empty");
        }
    }
}

在这里插入图片描述

3.2.2 映射中获取值

MapUtils 提供了一些方法来从映射中获取值,并将其转换为相应的类型。这些方法在获取值时会进行类型检查,如果类型不匹配,则返回默认值。

import org.apache.commons.collections4.MapUtils;

import java.util.HashMap;
import java.util.Map;

public class MapUtils02 {
    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<>();
        map.put("age", 30);
        map.put("height", 175.5);
        map.put("name", "Alice");

        Integer age = MapUtils.getInteger(map, "age");
        Double height = MapUtils.getDouble(map, "height");
        String name = MapUtils.getString(map, "name");

        System.out.println("Age: " + age); // 输出: Age: 30
        System.out.println("Height: " + height); // 输出: Height: 175.5
        System.out.println("Name: " + name); // 输出: Name: Alice
    }
}

在这里插入图片描述

3.2.3 安全添加键值对到映射

safeAddToMap 方法用于安全地将键值对添加到映射中,避免覆盖已有的键值对。

import org.apache.commons.collections4.MapUtils;

import java.util.HashMap;
import java.util.Map;

public class MapUtils03 {
    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<>();
        MapUtils.safeAddToMap(map, "name", "Alice");
        MapUtils.safeAddToMap(map, "age", 30);

        System.out.println(map); // 输出: {name=Alice, age=30}
    }
}

在这里插入图片描述

3.2.4 反转映射

invertMap 方法用于反转映射,即将键和值互换。

import org.apache.commons.collections4.MapUtils;

import java.util.HashMap;
import java.util.Map;

public class MapUtils04 {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("one", 1);
        map.put("two", 2);

        Map<Integer, String> invertedMap = MapUtils.invertMap(map);
        System.out.println(invertedMap); // 输出: {1=one, 2=two}
    }
}

在这里插入图片描述

3.3 扩展集合类型

commons-collections4 提供了许多扩展集合类型,例如:

  • 双向映射BidiMap
  • 有序映射OrderedMap
  • 多值映射MultiValuedMap
import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.bidimap.DualHashBidiMap;
import org.apache.commons.collections4.map.LinkedMap;
import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
import org.apache.commons.collections4.MultiValuedMap;

public class ExtendedCollectionsExample {
    public static void main(String[] args) {
        // 双向映射
        BidiMap<String, Integer> bidiMap = new DualHashBidiMap<>();
        bidiMap.put("Alice", 30);
        bidiMap.put("Bob", 25);
        System.out.println(bidiMap.get("Alice")); // 30
        System.out.println(bidiMap.getKey(25)); // Bob
        
        // 有序映射
        LinkedMap<String, Integer> orderedMap = new LinkedMap<>();
        orderedMap.put("Alice", 30);
        orderedMap.put("Bob", 25);
        orderedMap.put("Charlie", 35);
        System.out.println(orderedMap.firstKey()); // Alice
        System.out.println(orderedMap.nextKey("Alice")); // Bob
        
        // 多值映射
        MultiValuedMap<String, String> multiValuedMap = new ArrayListValuedHashMap<>();
        multiValuedMap.put("Alice", "Java");
        multiValuedMap.put("Alice", "Python");
        multiValuedMap.put("Bob", "C++");
        System.out.println(multiValuedMap.get("Alice")); // [Java, Python]
    }
}

在这里插入图片描述

4. 总结

Apache Commons Collections 4 是一个功能强大且易于使用的工具库,为 Java 开发者提供了丰富的实用工具类和扩展集合类型。通过使用 commons-collections4,开发者可以显著提高代码的简洁性和可读性,减少重复劳动,从而专注于业务逻辑的实现。无论是处理集合操作、集合转换,还是进行集合排序和迭代操作,commons-collections4 都能提供便捷的解决方案。

;