All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.cudrania.core.collection.CollectionUtils Maven / Gradle / Ivy

There is a newer version: 1.2.7
Show newest version
package com.cudrania.core.collection;

import com.cudrania.core.arrays.ArrayUtils;

import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
 * 集合工具类,提供对集合各种扩展操作的支持
 *
 * @author skyfalling
 */
public class CollectionUtils {


    /**
     * 判断集合是否为空
     *
     * @param collection
     * @param 
     * @return
     */
    public static  boolean isEmpty(Collection collection) {
        return collection == null || collection.isEmpty();
    }


    /**
     * 判断集合是否不为空
     *
     * @param collection
     * @param 
     * @return
     */
    public static  boolean isNotEmpty(Collection collection) {
        return !isEmpty(collection);
    }

    /**
     * 分批处理{@link Iterable}元素
     *
     * @param iterable 可遍历集合
     * @param limit    批量处理元素数量限制
     * @param consumer 元素处理对象
     */
    public static  void doBatch(Iterable iterable, int limit, Consumer> consumer) {
        List subList = new ArrayList<>(limit);
        for (E e : iterable) {
            subList.add(e);
            if (subList.size() == limit) {
                consumer.accept(subList);
                subList = new ArrayList<>(limit);
            }
        }
        if (subList.size() > 0) {
            consumer.accept(subList);
        }
    }

    /**
     * 将Iterator对象转化成Enumeration对象
     *
     * @param iterator Iterator对象实例
     * @return Enumeration对象实例
     */
    public static  Enumeration enumeration(Iterator iterator) {
        return new Enumeration() {

            @Override
            public boolean hasMoreElements() {
                return iterator.hasNext();
            }

            @Override
            public T nextElement() {
                return iterator.next();
            }

        };

    }

    /**
     * 将Enumeration对象转化成Iterator对象
     *
     * @param enumeration Enumeration对象实例
     * @return Iterator对象实例
     */
    public static  List list(Enumeration enumeration) {
        List list = new ArrayList<>();
        while (enumeration.hasMoreElements()) {
            list.add(enumeration.nextElement());
        }
        return list;
    }

    /**
     * 数组转链表
     *
     * @param array 数组对象
     * @return List泛型实例
     */
    public static  List list(T[] array) {
        return Arrays.stream(array).collect(Collectors.toList());
    }

    /**
     * 可枚举对象转链表
     *
     * @param iterable 可遍历集合
     * @return List泛型实例
     */
    public static  List list(Iterable iterable) {
        return list(iterable, Function.identity());
    }


    /**
     * 取元素的某个属性形成新的链表
     *
     * @param iterable 可遍历集合
     * @param func     生成元素的函数
     * @param       属性类型的泛型约束
     * @return 属性列表
     */
    public static  List list(Iterable iterable, Function func) {
        List list;
        if (iterable instanceof Collection) {
            list = new ArrayList<>(((Collection) iterable).size());
        } else {
            list = new ArrayList<>();
        }
        for (V o : iterable) {
            list.add(func.apply(o));
        }
        return list;
    }

    /**
     * 枚举器转链表
     *
     * @param iterator 枚举器
     * @param 
     * @return
     */
    public static  List list(Iterator iterator) {
        List list = new ArrayList<>();
        while (iterator.hasNext()) {
            list.add(iterator.next());
        }
        return list;
    }


    /**
     * 删除链表从from到to(不包括)索引位置的元素
     *
     * @param list
     * @param from
     * @param to
     * @param 
     */
    public static  void remove(List list, int from, int to) {
        list.subList(from, to).clear();
    }

    /**
     * 删除集合中满足条件的元素
     *
     * @param list
     * @param predicate
     * @param 
     */
    public static  void remove(Collection list, Predicate predicate) {
        list.removeIf(predicate);
    }

    /**
     * 删除集合中null元素
     *
     * @param list
     * @param 
     */
    public static  void removeNull(Collection list) {
        list.removeIf(Objects::isNull);
    }

    /**
     * 删除Map中value为null的键值对
     *
     * @param map
     * @param 
     * @param 
     */
    public static  void removeNull(Map map) {
        map.values().removeIf(Objects::isNull);
    }

    /**
     * 集合转Map,keyGen函数执行结果作为key值,元素本身作为value值
     *
     * @param iterable 可遍历集合
     * @param keyGen   生成key的函数
     * @param       key的泛型约束
     * @param       value的泛型约束
     */
    public static  Map map(Iterable iterable, Function keyGen) {
        return map(iterable, keyGen, Function.identity());
    }

    /**
     * 集合转Map,keyGen函数执行结果作为key值,valueGen执行结果作为value值
     *
     * @param iterable 可遍历集合
     * @param keyGen   生成Key的函数
     * @param valueGen 作为Value的函数
     * @param       key的泛型约束
     * @param       value的泛型约束
     * @param       元素的泛型约束
     */
    public static  Map map(Iterable iterable, Function keyGen, Function valueGen) {
        Map map;
        if (iterable instanceof Collection) {
            map = new HashMap<>(((Collection) iterable).size());
        } else {
            map = new HashMap<>();
        }
        for (T obj : iterable) {
            map.put(keyGen.apply(obj), valueGen.apply(obj));
        }
        return map;
    }


    /**
     * 将集合中元素按照指定函数分组
     *
     * @param iterable 可遍历集合
     * @param keyGen   生成key的函数
     * @param       key的泛型约束
     * @param       value的泛型约束
     */
    public static  Map> groupBy(Iterable iterable, Function keyGen) {
        return groupBy(iterable, keyGen, Function.identity());
    }

    /**
     * 将集合中元素按照指定函数分组
     *
     * @param iterable 可遍历集合
     * @param keyGen   生成key的函数
     * @param       key的泛型约束
     * @param       value的泛型约束
     */
    public static  Map> groupBy(Iterable iterable, Function keyGen, Function valueGen) {
        Map> map;
        if (iterable instanceof Collection) {
            map = new HashMap<>(((Collection) iterable).size());
        } else {
            map = new HashMap<>();
        }
        for (T obj : iterable) {
            K keyObj = keyGen.apply(obj);
            V valueObj = valueGen.apply(obj);
            map.computeIfAbsent(keyObj, (K k) -> new ArrayList<>()).add(valueObj);
        }
        return map;
    }


    /**
     * 将集合中元素按照数量分组
     *
     * @param iterable 可遍历集合
     * @param limit    每组元素个数
     */
    public static  List> grouped(Iterable iterable, int limit) {
        List> res = new ArrayList<>();
        doBatch(iterable, limit, l -> res.add(l));
        return res;
    }


    /**
     * 数组对象转列表
     *
     * @param source
     * @return
     */
    public static  List arrayToList(Object source) {
        return (List) Arrays.asList(ArrayUtils.toObjectArray(source));
    }


}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy