Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.xiaoleilu.hutool.collection.CollUtil Maven / Gradle / Ivy
package com.xiaoleilu.hutool.collection;
import java.lang.reflect.Type;
import java.util.AbstractCollection;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Deque;
import java.util.EnumSet;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.Stack;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.LinkedBlockingDeque;
import com.xiaoleilu.hutool.bean.BeanUtil;
import com.xiaoleilu.hutool.convert.Convert;
import com.xiaoleilu.hutool.convert.ConverterRegistry;
import com.xiaoleilu.hutool.exceptions.UtilException;
import com.xiaoleilu.hutool.lang.Editor;
import com.xiaoleilu.hutool.lang.Filter;
import com.xiaoleilu.hutool.lang.Matcher;
import com.xiaoleilu.hutool.map.MapUtil;
import com.xiaoleilu.hutool.util.ArrayUtil;
import com.xiaoleilu.hutool.util.ClassUtil;
import com.xiaoleilu.hutool.util.ObjectUtil;
import com.xiaoleilu.hutool.util.PageUtil;
import com.xiaoleilu.hutool.util.ReflectUtil;
import com.xiaoleilu.hutool.util.StrUtil;
import com.xiaoleilu.hutool.util.TypeUtil;
/**
* 集合相关工具类,包括数组
*
* @author xiaoleilu
* @since 3.1.1
*/
public class CollUtil {
/**
* 两个集合的并集
* 针对一个集合中存在多个相同元素的情况,计算两个集合中此元素的个数,保留最多的个数
* 例如:集合1:[a, b, c, c, c],集合2:[a, b, c, c]
* 结果:[a, b, c, c, c],此结果中只保留了三个c
*
* @param 集合元素类型
* @param coll1 集合1
* @param coll2 集合2
* @return 并集的集合,返回 {@link ArrayList}
*/
public static Collection union(final Collection coll1, final Collection coll2) {
final ArrayList list = new ArrayList<>();
if (isEmpty(coll1)) {
list.addAll(coll2);
} else if (isEmpty(coll2)) {
list.addAll(coll1);
} else {
final Map map1 = countMap(coll1);
final Map map2 = countMap(coll2);
final Set elts = newHashSet(coll2);
elts.addAll(coll1);
int m;
for (T t : elts) {
m = Math.max(Convert.toInt(map1.get(t), 0), Convert.toInt(map2.get(t), 0));
for (int i = 0; i < m; i++) {
list.add(t);
}
}
}
return list;
}
/**
* 多个集合的并集
* 针对一个集合中存在多个相同元素的情况,计算两个集合中此元素的个数,保留最多的个数
* 例如:集合1:[a, b, c, c, c],集合2:[a, b, c, c]
* 结果:[a, b, c, c, c],此结果中只保留了三个c
*
* @param 集合元素类型
* @param coll1 集合1
* @param coll2 集合2
* @param otherColls 其它集合
* @return 并集的集合,返回 {@link ArrayList}
*/
@SafeVarargs
public static Collection union(final Collection coll1, final Collection coll2, final Collection... otherColls) {
Collection union = union(coll1, coll2);
for (Collection coll : otherColls) {
union = union(union, coll);
}
return union;
}
/**
* 两个集合的交集
* 针对一个集合中存在多个相同元素的情况,计算两个集合中此元素的个数,保留最少的个数
* 例如:集合1:[a, b, c, c, c],集合2:[a, b, c, c]
* 结果:[a, b, c, c],此结果中只保留了两个c
*
* @param 集合元素类型
* @param coll1 集合1
* @param coll2 集合2
* @return 交集的集合,返回 {@link ArrayList}
*/
public static Collection intersection(final Collection coll1, final Collection coll2) {
final ArrayList list = new ArrayList<>();
if (isNotEmpty(coll1) && isNotEmpty(coll2)) {
final Map map1 = countMap(coll1);
final Map map2 = countMap(coll2);
final Set elts = newHashSet(coll2);
int m;
for (T t : elts) {
m = Math.min(Convert.toInt(map1.get(t), 0), Convert.toInt(map2.get(t), 0));
for (int i = 0; i < m; i++) {
list.add(t);
}
}
}
return list;
}
/**
* 多个集合的交集
* 针对一个集合中存在多个相同元素的情况,计算两个集合中此元素的个数,保留最少的个数
* 例如:集合1:[a, b, c, c, c],集合2:[a, b, c, c]
* 结果:[a, b, c, c],此结果中只保留了两个c
*
* @param 集合元素类型
* @param coll1 集合1
* @param coll2 集合2
* @param otherColls 其它集合
* @return 并集的集合,返回 {@link ArrayList}
*/
@SafeVarargs
public static Collection intersection(final Collection coll1, final Collection coll2, final Collection... otherColls) {
Collection intersection = intersection(coll1, coll2);
if (isEmpty(intersection)) {
return intersection;
}
for (Collection coll : otherColls) {
intersection = intersection(intersection, coll);
if (isEmpty(intersection)) {
return intersection;
}
}
return intersection;
}
/**
* 两个集合的差集
* 针对一个集合中存在多个相同元素的情况,计算两个集合中此元素的个数,保留两个集合中此元素个数差的个数
* 例如:集合1:[a, b, c, c, c],集合2:[a, b, c, c]
* 结果:[c],此结果中只保留了一个
*
* @param 集合元素类型
* @param coll1 集合1
* @param coll2 集合2
* @return 差集的集合,返回 {@link ArrayList}
*/
public static Collection disjunction(final Collection coll1, final Collection coll2) {
final ArrayList list = new ArrayList<>();
if (isNotEmpty(coll1) && isNotEmpty(coll2)) {
final Map map1 = countMap(coll1);
final Map map2 = countMap(coll2);
final Set elts = newHashSet(coll2);
elts.addAll(coll1);
int m;
for (T t : elts) {
m = Math.abs(Convert.toInt(map1.get(t), 0) - Convert.toInt(map2.get(t), 0));
for (int i = 0; i < m; i++) {
list.add(t);
}
}
}
return list;
}
/**
* 其中一个集合在另一个集合中是否至少包含一个元素,既是两个集合是否至少有一个共同的元素
*
* @param coll1 集合1
* @param coll2 集合2
* @return 其中一个集合在另一个集合中是否至少包含一个元素
* @since 2.1
* @see #intersection
*/
public static boolean containsAny(final Collection> coll1, final Collection> coll2) {
if (isEmpty(coll1) || isEmpty(coll2)) {
return false;
}
if (coll1.size() < coll2.size()) {
for (Object object : coll1) {
if (coll2.contains(object)) {
return true;
}
}
} else {
for (Object object : coll2) {
if (coll1.contains(object)) {
return true;
}
}
}
return false;
}
/**
* 根据集合返回一个元素计数的 {@link Map}
* 所谓元素计数就是假如这个集合中某个元素出现了n次,那将这个元素做为key,n做为value
* 例如:[a,b,c,c,c] 得到:
* a: 1
* b: 1
* c: 3
*
* @param 集合元素类型
* @param collection 集合
* @return {@link Map}
* @see IterUtil#countMap(Iterable)
*/
public static Map countMap(Iterable collection) {
return IterUtil.countMap(collection);
}
/**
* 以 conjunction 为分隔符将集合转换为字符串
* 如果集合元素为数组、{@link Iterable}或{@link Iterator},则递归组合其为字符串
*
* @param 集合元素类型
* @param iterable {@link Iterable}
* @param conjunction 分隔符
* @return 连接后的字符串
* @see IterUtil#join(Iterable, CharSequence)
*/
public static String join(Iterable iterable, CharSequence conjunction) {
return IterUtil.join(iterable, conjunction);
}
/**
* 以 conjunction 为分隔符将集合转换为字符串
* 如果集合元素为数组、{@link Iterable}或{@link Iterator},则递归组合其为字符串
*
* @param 集合元素类型
* @param iterator 集合
* @param conjunction 分隔符
* @return 连接后的字符串
* @see IterUtil#join(Iterator, CharSequence)
*/
public static String join(Iterator iterator, CharSequence conjunction) {
return IterUtil.join(iterator, conjunction);
}
/**
* 切取部分数据
* 切取后的栈将减少这些元素
*
* @param 集合元素类型
* @param surplusAlaDatas 原数据
* @param partSize 每部分数据的长度
* @return 切取出的数据或null
*/
public static List popPart(Stack surplusAlaDatas, int partSize) {
if (isEmpty(surplusAlaDatas)) {
return null;
}
final List currentAlaDatas = new ArrayList<>();
int size = surplusAlaDatas.size();
// 切割
if (size > partSize) {
for (int i = 0; i < partSize; i++) {
currentAlaDatas.add(surplusAlaDatas.pop());
}
} else {
for (int i = 0; i < size; i++) {
currentAlaDatas.add(surplusAlaDatas.pop());
}
}
return currentAlaDatas;
}
/**
* 切取部分数据
* 切取后的栈将减少这些元素
*
* @param 集合元素类型
* @param surplusAlaDatas 原数据
* @param partSize 每部分数据的长度
* @return 切取出的数据或null
*/
public static List popPart(Deque surplusAlaDatas, int partSize) {
if (isEmpty(surplusAlaDatas)) {
return null;
}
final List currentAlaDatas = new ArrayList<>();
int size = surplusAlaDatas.size();
// 切割
if (size > partSize) {
for (int i = 0; i < partSize; i++) {
currentAlaDatas.add(surplusAlaDatas.pop());
}
} else {
for (int i = 0; i < size; i++) {
currentAlaDatas.add(surplusAlaDatas.pop());
}
}
return currentAlaDatas;
}
// ----------------------------------------------------------------------------------------------- new HashMap
/**
* 新建一个HashMap
*
* @param Key类型
* @param Value类型
* @return HashMap对象
* @see MapUtil#newHashMap()
*/
public static HashMap newHashMap() {
return MapUtil.newHashMap();
}
/**
* 新建一个HashMap
*
* @param Key类型
* @param Value类型
* @param size 初始大小,由于默认负载因子0.75,传入的size会实际初始大小为size / 0.75
* @param isOrder Map的Key是否有序,有序返回 {@link LinkedHashMap},否则返回 {@link HashMap}
* @return HashMap对象
* @since 3.0.4
* @see MapUtil#newHashMap(int, boolean)
*/
public static HashMap newHashMap(int size, boolean isOrder) {
return MapUtil.newHashMap(size, isOrder);
}
/**
* 新建一个HashMap
*
* @param Key类型
* @param Value类型
* @param size 初始大小,由于默认负载因子0.75,传入的size会实际初始大小为size / 0.75
* @return HashMap对象
* @see MapUtil#newHashMap(int)
*/
public static HashMap newHashMap(int size) {
return MapUtil.newHashMap(size);
}
// ----------------------------------------------------------------------------------------------- new HashSet
/**
* 新建一个HashSet
*
* @param 集合元素类型
* @param ts 元素数组
* @return HashSet对象
*/
@SafeVarargs
public static HashSet newHashSet(T... ts) {
return newHashSet(false, ts);
}
/**
* 新建一个HashSet
*
* @param 集合元素类型
* @param isSorted 是否有序,有序返回 {@link LinkedHashSet},否则返回 {@link HashSet}
* @param ts 元素数组
* @return HashSet对象
*/
@SafeVarargs
public static HashSet newHashSet(boolean isSorted, T... ts) {
if (null == ts) {
return isSorted ? new LinkedHashSet() : new HashSet();
}
int initialCapacity = Math.max((int) (ts.length / .75f) + 1, 16);
HashSet set = isSorted ? new LinkedHashSet(initialCapacity) : new HashSet(initialCapacity);
for (T t : ts) {
set.add(t);
}
return set;
}
/**
* 新建一个HashSet
*
* @param 集合元素类型
* @param collection 集合
* @return HashSet对象
*/
public static HashSet newHashSet(Collection collection) {
return newHashSet(false, collection);
}
/**
* 新建一个HashSet
*
* @param 集合元素类型
* @param isSorted 是否有序,有序返回 {@link LinkedHashSet},否则返回{@link HashSet}
* @param collection 集合,用于初始化Set
* @return HashSet对象
*/
public static HashSet newHashSet(boolean isSorted, Collection collection) {
return isSorted ? new LinkedHashSet(collection) : new HashSet(collection);
}
/**
* 新建一个HashSet
*
* @param 集合元素类型
* @param isSorted 是否有序,有序返回 {@link LinkedHashSet},否则返回{@link HashSet}
* @param iter {@link Iterator}
* @return HashSet对象
* @since 3.0.8
*/
public static HashSet newHashSet(boolean isSorted, Iterator iter) {
if (null == iter) {
return newHashSet(isSorted, (T[]) null);
}
final HashSet set = isSorted ? new LinkedHashSet() : new HashSet();
while (iter.hasNext()) {
set.add(iter.next());
}
return set;
}
/**
* 新建一个HashSet
*
* @param 集合元素类型
* @param isSorted 是否有序,有序返回 {@link LinkedHashSet},否则返回{@link HashSet}
* @param enumration {@link Enumeration}
* @return HashSet对象
* @since 3.0.8
*/
public static HashSet newHashSet(boolean isSorted, Enumeration enumration) {
if (null == enumration) {
return newHashSet(isSorted, (T[]) null);
}
final HashSet set = isSorted ? new LinkedHashSet() : new HashSet();
while (enumration.hasMoreElements()) {
set.add(enumration.nextElement());
}
return set;
}
// ----------------------------------------------------------------------------------------------- new ArrayList
/**
* 新建一个ArrayList
*
* @param 集合元素类型
* @param values 数组
* @return ArrayList对象
*/
@SafeVarargs
public static ArrayList newArrayList(T... values) {
if (null == values) {
return new ArrayList<>();
}
ArrayList arrayList = new ArrayList(values.length);
for (T t : values) {
arrayList.add(t);
}
return arrayList;
}
/**
* 新建一个ArrayList
*
* @param 集合元素类型
* @param collection 集合
* @return ArrayList对象
*/
public static ArrayList newArrayList(Collection collection) {
if (null == collection) {
return new ArrayList<>();
}
return new ArrayList(collection);
}
/**
* 新建一个ArrayList
* 提供的参数为null时返回空{@link ArrayList}
*
* @param 集合元素类型
* @param iterable {@link Iterable}
* @return ArrayList对象
* @since 3.1.0
*/
public static ArrayList newArrayList(Iterable iterable) {
return (null == iterable) ? new ArrayList() : newArrayList(iterable.iterator());
}
/**
* 新建一个ArrayList
* 提供的参数为null时返回空{@link ArrayList}
*
* @param 集合元素类型
* @param iter {@link Iterator}
* @return ArrayList对象
* @since 3.0.8
*/
public static ArrayList newArrayList(Iterator iter) {
final ArrayList list = new ArrayList<>();
if (null == iter) {
return list;
}
while (iter.hasNext()) {
list.add(iter.next());
}
return list;
}
/**
* 新建一个ArrayList
* 提供的参数为null时返回空{@link ArrayList}
*
* @param 集合元素类型
* @param enumration {@link Enumeration}
* @return ArrayList对象
* @since 3.0.8
*/
public static ArrayList newArrayList(Enumeration enumration) {
final ArrayList list = new ArrayList<>();
if (null == enumration) {
return list;
}
while (enumration.hasMoreElements()) {
list.add(enumration.nextElement());
}
return list;
}
/**
* 新建一个CopyOnWriteArrayList
*
* @param 集合元素类型
* @param collection 集合
* @return {@link CopyOnWriteArrayList}
*/
public static CopyOnWriteArrayList newCopyOnWriteArrayList(Collection collection) {
return (null == collection) ? (new CopyOnWriteArrayList()) : (new CopyOnWriteArrayList(collection));
}
/**
* 新建{@link BlockingQueue}
* 在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。
*
* @param capacity 容量
* @param isLinked 是否为链表形式
* @return {@link BlockingQueue}
* @since 3.3.0
*/
public static BlockingQueue newBlockingQueue(int capacity, boolean isLinked){
BlockingQueue queue;
if(isLinked) {
queue = new LinkedBlockingDeque<>(capacity);
}else {
queue = new ArrayBlockingQueue<>(capacity);
}
return queue;
}
/**
* 创建新的集合对象
*
* @param 集合类型
* @param collectionType 集合类型
* @return 集合类型对应的实例
* @since 3.0.8
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static Collection create(Class> collectionType) {
Collection list = null;
if (collectionType.isAssignableFrom(AbstractCollection.class)) {
// 抽象集合默认使用ArrayList
list = new ArrayList<>();
}
// Set
else if (collectionType.isAssignableFrom(HashSet.class)) {
list = new HashSet<>();
} else if (collectionType.isAssignableFrom(LinkedHashSet.class)) {
list = new LinkedHashSet<>();
} else if (collectionType.isAssignableFrom(TreeSet.class)) {
list = new TreeSet<>();
} else if (collectionType.isAssignableFrom(EnumSet.class)) {
list = (Collection) EnumSet.noneOf((Class) ClassUtil.getTypeArgument(collectionType));
}
// List
else if (collectionType.isAssignableFrom(ArrayList.class)) {
list = new ArrayList<>();
} else if (collectionType.isAssignableFrom(LinkedList.class)) {
list = new LinkedList<>();
}
// Others,直接实例化
else {
try {
list = (Collection) ReflectUtil.newInstance(collectionType);
} catch (Exception e) {
throw new UtilException(e);
}
}
return list;
}
/**
* 创建Map
* 传入抽象Map{@link AbstractMap}和{@link Map}类将默认创建{@link HashMap}
*
* @param map键类型
* @param map值类型
* @param mapType map类型
* @return {@link Map}实例
* @see MapUtil#createMap(Class)
*/
public static Map createMap(Class> mapType) {
return MapUtil.createMap(mapType);
}
/**
* 去重集合
*
* @param 集合元素类型
* @param collection 集合
* @return {@link ArrayList}
*/
public static ArrayList distinct(Collection collection) {
if (isEmpty(collection)) {
return new ArrayList<>();
} else if (collection instanceof Set) {
return new ArrayList<>(collection);
} else {
return new ArrayList<>(new LinkedHashSet<>(collection));
}
}
/**
* 截取集合的部分
*
* @param 集合元素类型
* @param list 被截取的数组
* @param start 开始位置(包含)
* @param end 结束位置(不包含)
* @return 截取后的数组,当开始位置超过最大时,返回null
*/
public static List sub(List list, int start, int end) {
if (list == null || list.isEmpty()) {
return null;
}
if (start < 0) {
start = 0;
}
if (end < 0) {
end = 0;
}
if (start > end) {
int tmp = start;
start = end;
end = tmp;
}
final int size = list.size();
if (end > size) {
if (start >= size) {
return null;
}
end = size;
}
return list.subList(start, end);
}
/**
* 截取集合的部分
*
* @param 集合元素类型
* @param list 被截取的数组
* @param start 开始位置(包含)
* @param end 结束位置(不包含)
* @return 截取后的数组,当开始位置超过最大时,返回null
*/
public static List sub(Collection list, int start, int end) {
if (list == null || list.isEmpty()) {
return null;
}
return sub(new ArrayList(list), start, end);
}
/**
* 对集合按照指定长度分段,每一个段为单独的集合,返回这个集合的列表
*
* @param 集合元素类型
* @param collection 集合
* @param size 每个段的长度
* @return 分段列表
*/
public static List> split(Collection collection, int size) {
final List> result = new ArrayList<>();
ArrayList subList = new ArrayList<>(size);
for (T t : collection) {
if (subList.size() >= size) {
result.add(subList);
subList = new ArrayList<>(size);
}
subList.add(t);
}
result.add(subList);
return result;
}
/**
* 过滤
* 过滤过程通过传入的Editor实现来返回需要的元素内容,这个Editor实现可以实现以下功能:
*
*
* 1、过滤出需要的对象,如果返回null表示这个元素对象抛弃
* 2、修改元素对象,返回集合中为修改后的对象
*
*
* @param 集合元素类型
* @param collection 集合
* @param editor 编辑器接口
* @return 过滤后的数组
*/
public static Collection filter(Collection collection, Editor editor) {
Collection collection2 = ObjectUtil.clone(collection);
try {
collection2.clear();
} catch (UnsupportedOperationException e) {
//克隆后的对象不支持清空,说明为不可变集合对象,使用默认的ArrayList保存结果
collection2 = new ArrayList<>();
}
T modified;
for (T t : collection) {
modified = editor.edit(t);
if (null != modified) {
collection2.add(modified);
}
}
return collection2;
}
/**
* 过滤
* 过滤过程通过传入的Filter实现来过滤返回需要的元素内容,这个Editor实现可以实现以下功能:
*
*
* 1、过滤出需要的对象,{@link Filter#accept(Object)}方法返回true的对象将被加入结果集合中
*
*
* @param 集合元素类型
* @param collection 集合
* @param filter 过滤器
* @return 过滤后的数组
* @since 3.1.0
*/
public static Collection filter(Collection collection, Filter filter) {
Collection collection2 = ObjectUtil.clone(collection);
try {
collection2.clear();
} catch (UnsupportedOperationException e) {
//克隆后的对象不支持清空,说明为不可变集合对象,使用默认的ArrayList保存结果
collection2 = new ArrayList<>();
}
for (T t : collection) {
if (filter.accept(t)) {
collection2.add(t);
}
}
return collection2;
}
/**
* 去除{@code null} 元素
* @param collection 集合
* @return 处理后的集合
* @since 3.2.2
*/
public static Collection removeNull(Collection collection) {
return filter(collection, new Editor() {
@Override
public T edit(T t) {
//返回null便不加入集合
return t;
}});
}
/**
* 去除{@code null}或者"" 元素
* @param collection 集合
* @return 处理后的集合
* @since 3.2.2
*/
public static Collection removeEmpty(Collection collection) {
return filter(collection, new Filter() {
@Override
public boolean accept(T t) {
return false == StrUtil.isEmpty(t);
}});
}
/**
* 去除{@code null}或者""或者空白字符串 元素
* @param collection 集合
* @return 处理后的集合
* @since 3.2.2
*/
public static Collection removeBlank(Collection collection) {
return filter(collection, new Filter() {
@Override
public boolean accept(T t) {
return false == StrUtil.isBlank(t);
}});
}
/**
* 通过Editor抽取集合元素中的某些值返回为新列表
* 例如提供的是一个Bean列表,通过Editor接口实现获取某个字段值,返回这个字段值组成的新列表
*
* @param collection 原集合
* @param editor 编辑器
* @return 抽取后的新列表
*/
public static List extract(Iterable> collection, Editor editor) {
final List fieldValueList = new ArrayList<>();
for (Object bean : collection) {
fieldValueList.add(editor.edit(bean));
}
return fieldValueList;
}
/**
* 获取给定Bean列表中指定字段名对应字段值的列表
* 列表元素支持Bean与Map
*
* @param collection Bean集合或Map集合
* @param fieldName 字段名或map的键
* @return 字段值列表
* @since 3.1.0
*/
public static List getFieldValues(Iterable> collection, final String fieldName) {
return extract(collection, new Editor(){
@Override
public Object edit(Object bean) {
if (bean instanceof Map) {
return ((Map, ?>) bean).get(fieldName);
} else {
return ReflectUtil.getFieldValue(bean, fieldName);
}
}
});
}
/**
* 查找第一个匹配元素对象
*
* @param 集合元素类型
* @param collection 集合
* @param filter 过滤器,满足过滤条件的第一个元素将被返回
* @return 满足过滤条件的第一个元素
* @since 3.1.0
*/
public static T findOne(Iterable collection, Filter filter) {
for (T t : collection) {
if (filter.accept(t)) {
return t;
}
}
return null;
}
/**
* 查找第一个匹配元素对象
* 如果集合元素是Map,则比对键和值是否相同,相同则返回
* 如果为普通Bean,则通过反射比对元素字段名对应的字段值是否相同,相同则返回
* 如果给定字段值参数是{@code null} 且元素对象中的字段值也为{@code null}则认为相同
*
* @param 集合元素类型
* @param collection 集合,集合元素可以是Bean或者Map
* @param fieldName 集合元素对象的字段名或map的键
* @param fieldValue 集合元素对象的字段值或map的值
* @return 满足条件的第一个元素
* @since 3.1.0
*/
public static T findOneByField(Iterable collection, final String fieldName, final Object fieldValue) {
return findOne(collection, new Filter(){
@Override
public boolean accept(T t) {
if (t instanceof Map) {
final Map, ?> map = (Map, ?>) t;
final Object value = map.get(fieldName);
return ObjectUtil.equal(value, fieldValue);
}
// 普通Bean
final Object value = ReflectUtil.getFieldValue(t, fieldName);
return ObjectUtil.equal(value, fieldValue);
}
});
}
/**
* 过滤
* 过滤过程通过传入的Editor实现来返回需要的元素内容,这个Editor实现可以实现以下功能:
*
*
* 1、过滤出需要的对象,如果返回null表示这个元素对象抛弃
* 2、修改元素对象,返回集合中为修改后的对象
*
*
* @param Key类型
* @param Value类型
* @param map Map
* @param editor 编辑器接口
* @return 过滤后的Map
* @see MapUtil#filter(Map, Editor)
*/
public static Map filter(Map map, Editor> editor) {
return MapUtil.filter(map, editor);
}
/**
* 过滤
* 过滤过程通过传入的Editor实现来返回需要的元素内容,这个Editor实现可以实现以下功能:
*
*
* 1、过滤出需要的对象,如果返回null表示这个元素对象抛弃
* 2、修改元素对象,返回集合中为修改后的对象
*
*
* @param Key类型
* @param Value类型
* @param map Map
* @param filter 编辑器接口
* @return 过滤后的Map
* @since 3.1.0
* @see MapUtil#filter(Map, Filter)
*/
public static Map filter(Map map, Filter> filter) {
return MapUtil.filter(map, filter);
}
/**
* 集合中匹配规则的数量
*
* @param 集合元素类型
* @param iterable {@link Iterable}
* @param matcher 匹配器,为空则全部匹配
* @return 匹配数量
*/
public static int count(Iterable iterable, Matcher matcher) {
int count = 0;
if (null != iterable) {
for (T t : iterable) {
if (null == matcher || matcher.match(t)) {
count++;
}
}
}
return count;
}
// ---------------------------------------------------------------------- isEmpty
/**
* 集合是否为空
*
* @param collection 集合
* @return 是否为空
*/
public static boolean isEmpty(Collection> collection) {
return collection == null || collection.isEmpty();
}
/**
* Map是否为空
*
* @param map 集合
* @return 是否为空
* @see MapUtil#isEmpty(Map)
*/
public static boolean isEmpty(Map, ?> map) {
return MapUtil.isEmpty(map);
}
/**
* Iterable是否为空
*
* @param iterable Iterable对象
* @return 是否为空
* @see IterUtil#isEmpty(Iterable)
*/
public static boolean isEmpty(Iterable> iterable) {
return IterUtil.isEmpty(iterable);
}
/**
* Iterator是否为空
*
* @param Iterator Iterator对象
* @return 是否为空
* @see IterUtil#isEmpty(Iterator)
*/
public static boolean isEmpty(Iterator> Iterator) {
return IterUtil.isEmpty(Iterator);
}
/**
* Enumeration是否为空
*
* @param enumeration {@link Enumeration}
* @return 是否为空
*/
public static boolean isEmpty(Enumeration> enumeration) {
return null == enumeration || false == enumeration.hasMoreElements();
}
// ---------------------------------------------------------------------- isNotEmpty
/**
* 集合是否为非空
*
* @param collection 集合
* @return 是否为非空
*/
public static boolean isNotEmpty(Collection> collection) {
return false == isEmpty(collection);
}
/**
* Map是否为非空
*
* @param map 集合
* @return 是否为非空
* @see MapUtil#isNotEmpty(Map)
*/
public static boolean isNotEmpty(Map, ?> map) {
return MapUtil.isNotEmpty(map);
}
/**
* Iterable是否为空
*
* @param iterable Iterable对象
* @return 是否为空
* @see IterUtil#isNotEmpty(Iterable)
*/
public static boolean isNotEmpty(Iterable> iterable) {
return IterUtil.isNotEmpty(iterable);
}
/**
* Iterator是否为空
*
* @param Iterator Iterator对象
* @return 是否为空
* @see IterUtil#isNotEmpty(Iterator)
*/
public static boolean isNotEmpty(Iterator> Iterator) {
return IterUtil.isNotEmpty(Iterator);
}
/**
* Enumeration是否为空
*
* @param enumeration {@link Enumeration}
* @return 是否为空
*/
public static boolean isNotEmpty(Enumeration> enumeration) {
return null != enumeration && enumeration.hasMoreElements();
}
/**
* 是否包含{@code null}元素
*
* @param iterable 被检查的Iterable对象,如果为{@code null} 返回false
* @return 是否包含{@code null}元素
* @since 3.0.7
* @see IterUtil#hasNull(Iterable)
*/
public static boolean hasNull(Iterable> iterable) {
return IterUtil.hasNull(iterable);
}
// ---------------------------------------------------------------------- zip
/**
* 映射键值(参考Python的zip()函数)
* 例如:
* keys = a,b,c,d
* values = 1,2,3,4
* delimiter = , 则得到的Map是 {a=1, b=2, c=3, d=4}
* 如果两个数组长度不同,则只对应最短部分
*
* @param keys 键列表
* @param values 值列表
* @param delimiter 分隔符
* @param isOrder 是否有序
* @return Map
* @since 3.0.4
*/
public static Map zip(String keys, String values, String delimiter, boolean isOrder) {
return ArrayUtil.zip(StrUtil.split(keys, delimiter), StrUtil.split(values, delimiter), isOrder);
}
/**
* 映射键值(参考Python的zip()函数),返回Map无序
* 例如:
* keys = a,b,c,d
* values = 1,2,3,4
* delimiter = , 则得到的Map是 {a=1, b=2, c=3, d=4}
* 如果两个数组长度不同,则只对应最短部分
*
* @param keys 键列表
* @param values 值列表
* @param delimiter 分隔符
* @return Map
*/
public static Map zip(String keys, String values, String delimiter) {
return zip(keys, values, delimiter, false);
}
/**
* 映射键值(参考Python的zip()函数)
* 例如:
* keys = [a,b,c,d]
* values = [1,2,3,4]
* 则得到的Map是 {a=1, b=2, c=3, d=4}
* 如果两个数组长度不同,则只对应最短部分
*
* @param 键类型
* @param 值类型
* @param keys 键列表
* @param values 值列表
* @return Map
*/
public static Map zip(Collection keys, Collection values) {
if (isEmpty(keys) || isEmpty(values)) {
return null;
}
final List keyList = new ArrayList(keys);
final List valueList = new ArrayList(values);
final int size = Math.min(keys.size(), values.size());
final Map map = new HashMap((int) (size / 0.75));
for (int i = 0; i < size; i++) {
map.put(keyList.get(i), valueList.get(i));
}
return map;
}
/**
* 将Entry集合转换为HashMap
*
* @param 键类型
* @param 值类型
* @param entryIter entry集合
* @return Map
* @see IterUtil#toMap(Iterable)
*/
public static HashMap toMap(Iterable> entryIter) {
return IterUtil.toMap(entryIter);
}
/**
* 将数组转换为Map(HashMap),支持数组元素类型为:
*
*
* Map.Entry
* 长度大于1的数组(取前两个值),如果不满足跳过此元素
* Iterable 长度也必须大于1(取前两个值),如果不满足跳过此元素
* Iterator 长度也必须大于1(取前两个值),如果不满足跳过此元素
*
*
*
* Map<Object, Object> colorMap = CollectionUtil.toMap(new String[][] {{
* {"RED", "#FF0000"},
* {"GREEN", "#00FF00"},
* {"BLUE", "#0000FF"}});
*
*
* 参考:commons-lang
*
* @param array 数组。元素类型为Map.Entry、数组、Iterable、Iterator
* @return {@link HashMap}
* @since 3.0.8
* @see MapUtil#of(Object[])
*/
public static HashMap toMap(Object[] array) {
return MapUtil.of(array);
}
/**
* 将集合转换为排序后的TreeSet
*
* @param 集合元素类型
* @param collection 集合
* @param comparator 比较器
* @return treeSet
*/
public static TreeSet toTreeSet(Collection