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.jchanghong.core.collection.IterUtil Maven / Gradle / Ivy
package com.jchanghong.core.collection;
import com.jchanghong.core.exceptions.UtilException;
import com.jchanghong.core.lang.Filter;
import com.jchanghong.core.lang.func.Func1;
import com.jchanghong.core.map.MapUtil;
import com.jchanghong.core.util.ArrayUtil;
import com.jchanghong.core.util.ObjectUtil;
import com.jchanghong.core.util.ReflectUtil;
import com.jchanghong.core.util.StrUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Function;
/**
* {@link Iterable} 和 {@link Iterator} 相关工具类
*
* @author Looly
* @since 3.1.0
*/
public class IterUtil {
/**
* Iterable是否为空
*
* @param iterable Iterable对象
* @return 是否为空
*/
public static boolean isEmpty(Iterable> iterable) {
return null == iterable || isEmpty(iterable.iterator());
}
/**
* Iterator是否为空
*
* @param Iterator Iterator对象
* @return 是否为空
*/
public static boolean isEmpty(Iterator> Iterator) {
return null == Iterator || false == Iterator.hasNext();
}
/**
* Iterable是否为空
*
* @param iterable Iterable对象
* @return 是否为空
*/
public static boolean isNotEmpty(Iterable> iterable) {
return null != iterable && isNotEmpty(iterable.iterator());
}
/**
* Iterator是否为空
*
* @param Iterator Iterator对象
* @return 是否为空
*/
public static boolean isNotEmpty(Iterator> Iterator) {
return null != Iterator && Iterator.hasNext();
}
/**
* 是否包含{@code null}元素
*
* @param iter 被检查的{@link Iterable}对象,如果为{@code null} 返回true
* @return 是否包含{@code null}元素
*/
public static boolean hasNull(Iterable> iter) {
return hasNull(null == iter ? null : iter.iterator());
}
/**
* 是否包含{@code null}元素
*
* @param iter 被检查的{@link Iterator}对象,如果为{@code null} 返回true
* @return 是否包含{@code null}元素
*/
public static boolean hasNull(Iterator> iter) {
if (null == iter) {
return true;
}
while (iter.hasNext()) {
if (null == iter.next()) {
return true;
}
}
return false;
}
/**
* 是否全部元素为null
*
* @param iter iter 被检查的{@link Iterable}对象,如果为{@code null} 返回true
* @return 是否全部元素为null
* @since 3.3.0
*/
public static boolean isAllNull(Iterable> iter) {
return isAllNull(null == iter ? null : iter.iterator());
}
/**
* 是否全部元素为null
*
* @param iter iter 被检查的{@link Iterator}对象,如果为{@code null} 返回true
* @return 是否全部元素为null
* @since 3.3.0
*/
public static boolean isAllNull(Iterator> iter) {
if (null == iter) {
return true;
}
while (iter.hasNext()) {
if (null != iter.next()) {
return false;
}
}
return true;
}
/**
* 根据集合返回一个元素计数的 {@link Map}
* 所谓元素计数就是假如这个集合中某个元素出现了n次,那将这个元素做为key,n做为value
* 例如:[a,b,c,c,c] 得到:
* a: 1
* b: 1
* c: 3
*
* @param 集合元素类型
* @param iter {@link Iterable},如果为null返回一个空的Map
* @return {@link Map}
* @deprecated 如果对象同时实现Iterable和Iterator接口会产生歧义,请使用CollUtil.countMap
*/
@Deprecated
public static Map countMap(Iterable iter) {
return countMap(null == iter ? null : iter.iterator());
}
/**
* 根据集合返回一个元素计数的 {@link Map}
* 所谓元素计数就是假如这个集合中某个元素出现了n次,那将这个元素做为key,n做为value
* 例如:[a,b,c,c,c] 得到:
* a: 1
* b: 1
* c: 3
*
* @param 集合元素类型
* @param iter {@link Iterator},如果为null返回一个空的Map
* @return {@link Map}
*/
public static Map countMap(Iterator iter) {
final HashMap countMap = new HashMap<>();
if (null != iter) {
Integer count;
T t;
while (iter.hasNext()) {
t = iter.next();
count = countMap.get(t);
if (null == count) {
countMap.put(t, 1);
} else {
countMap.put(t, count + 1);
}
}
}
return countMap;
}
/**
* 字段值与列表值对应的Map,常用于元素对象中有唯一ID时需要按照这个ID查找对象的情况
* 例如:车牌号 =》车
*
* @param 字段名对应值得类型,不确定请使用Object
* @param 对象类型
* @param iter 对象列表
* @param fieldName 字段名(会通过反射获取其值)
* @return 某个字段值与对象对应Map
* @since 4.0.4
* @deprecated 如果对象同时实现Iterable和Iterator接口会产生歧义,请使用CollUtil.fieldValueMap
*/
@Deprecated
public static Map fieldValueMap(Iterable iter, String fieldName) {
return fieldValueMap(null == iter ? null : iter.iterator(), fieldName);
}
/**
* 字段值与列表值对应的Map,常用于元素对象中有唯一ID时需要按照这个ID查找对象的情况
* 例如:车牌号 =》车
*
* @param 字段名对应值得类型,不确定请使用Object
* @param 对象类型
* @param iter 对象列表
* @param fieldName 字段名(会通过反射获取其值)
* @return 某个字段值与对象对应Map
* @since 4.0.4
*/
@SuppressWarnings("unchecked")
public static Map fieldValueMap(Iterator iter, String fieldName) {
return toMap(iter, new HashMap<>(), (value) -> (K) ReflectUtil.getFieldValue(value, fieldName));
}
/**
* 两个字段值组成新的Map
*
* @param 字段名对应值得类型,不确定请使用Object
* @param 值类型,不确定使用Object
* @param iterable 对象列表
* @param fieldNameForKey 做为键的字段名(会通过反射获取其值)
* @param fieldNameForValue 做为值的字段名(会通过反射获取其值)
* @return 某个字段值与对象对应Map
* @since 4.6.2
* @deprecated 如果对象同时实现Iterable和Iterator接口会产生歧义,请使用CollUtil.fieldValueMap
*/
@Deprecated
public static Map fieldValueAsMap(Iterable> iterable, String fieldNameForKey, String fieldNameForValue) {
return fieldValueAsMap(null == iterable ? null : iterable.iterator(), fieldNameForKey, fieldNameForValue);
}
/**
* 两个字段值组成新的Map
*
* @param 字段名对应值得类型,不确定请使用Object
* @param 值类型,不确定使用Object
* @param iter 对象列表
* @param fieldNameForKey 做为键的字段名(会通过反射获取其值)
* @param fieldNameForValue 做为值的字段名(会通过反射获取其值)
* @return 某个字段值与对象对应Map
* @since 4.0.10
*/
@SuppressWarnings("unchecked")
public static Map fieldValueAsMap(Iterator> iter, String fieldNameForKey, String fieldNameForValue) {
return toMap(iter, new HashMap<>(),
(value) -> (K) ReflectUtil.getFieldValue(value, fieldNameForKey),
(value) -> (V) ReflectUtil.getFieldValue(value, fieldNameForValue)
);
}
/**
* 获取指定Bean列表中某个字段,生成新的列表
*
* @param 对象类型
* @param iterable 对象列表
* @param fieldName 字段名(会通过反射获取其值)
* @return 某个字段值与对象对应Map
* @since 4.6.2
*/
public static List fieldValueList(Iterable iterable, String fieldName) {
return fieldValueList(null == iterable ? null : iterable.iterator(), fieldName);
}
/**
* 获取指定Bean列表中某个字段,生成新的列表
*
* @param 对象类型
* @param iter 对象列表
* @param fieldName 字段名(会通过反射获取其值)
* @return 某个字段值与对象对应Map
* @since 4.0.10
*/
public static List fieldValueList(Iterator iter, String fieldName) {
final List result = new ArrayList<>();
if (null != iter) {
V value;
while (iter.hasNext()) {
value = iter.next();
result.add(ReflectUtil.getFieldValue(value, fieldName));
}
}
return result;
}
/**
* 以 conjunction 为分隔符将集合转换为字符串
*
* @param 集合元素类型
* @param iterable {@link Iterable}
* @param conjunction 分隔符
* @return 连接后的字符串
* @deprecated 如果对象同时实现Iterable和Iterator接口会产生歧义,请使用CollUtil.join
*/
@Deprecated
public static String join(Iterable iterable, CharSequence conjunction) {
if (null == iterable) {
return null;
}
return join(iterable.iterator(), conjunction);
}
/**
* 以 conjunction 为分隔符将集合转换为字符串
*
* @param 集合元素类型
* @param iterable {@link Iterable}
* @param conjunction 分隔符
* @param prefix 每个元素添加的前缀,null表示不添加
* @param suffix 每个元素添加的后缀,null表示不添加
* @return 连接后的字符串
* @since 4.0.10
* @deprecated 如果对象同时实现Iterable和Iterator接口会产生歧义,请使用CollUtil.join
*/
@Deprecated
public static String join(Iterable iterable, CharSequence conjunction, String prefix, String suffix) {
if (null == iterable) {
return null;
}
return join(iterable.iterator(), conjunction, prefix, suffix);
}
/**
* 以 conjunction 为分隔符将集合转换为字符串
* 如果集合元素为数组、{@link Iterable}或{@link Iterator},则递归组合其为字符串
*
* @param 集合元素类型
* @param iterator 集合
* @param conjunction 分隔符
* @return 连接后的字符串
*/
public static String join(Iterator iterator, CharSequence conjunction) {
return join(iterator, conjunction, null, null);
}
/**
* 以 conjunction 为分隔符将集合转换为字符串
* 如果集合元素为数组、{@link Iterable}或{@link Iterator},则递归组合其为字符串
*
* @param 集合元素类型
* @param iterator 集合
* @param conjunction 分隔符
* @param prefix 每个元素添加的前缀,null表示不添加
* @param suffix 每个元素添加的后缀,null表示不添加
* @return 连接后的字符串
* @since 4.0.10
*/
public static String join(Iterator iterator, CharSequence conjunction, String prefix, String suffix) {
if (null == iterator) {
return null;
}
final StringBuilder sb = new StringBuilder();
boolean isFirst = true;
T item;
while (iterator.hasNext()) {
if (isFirst) {
isFirst = false;
} else {
sb.append(conjunction);
}
item = iterator.next();
if (ArrayUtil.isArray(item)) {
sb.append(ArrayUtil.join(ArrayUtil.wrap(item), conjunction, prefix, suffix));
} else if (item instanceof Iterable>) {
sb.append(join((Iterable>) item, conjunction, prefix, suffix));
} else if (item instanceof Iterator>) {
sb.append(join((Iterator>) item, conjunction, prefix, suffix));
} else {
sb.append(StrUtil.wrap(String.valueOf(item), prefix, suffix));
}
}
return sb.toString();
}
/**
* 将Entry集合转换为HashMap
*
* @param 键类型
* @param 值类型
* @param entryIter entry集合
* @return Map
*/
public static HashMap toMap(Iterable> entryIter) {
final HashMap map = new HashMap<>();
if (isNotEmpty(entryIter)) {
for (Entry entry : entryIter) {
map.put(entry.getKey(), entry.getValue());
}
}
return map;
}
/**
* 将键列表和值列表转换为Map
* 以键为准,值与键位置需对应。如果键元素数多于值元素,多余部分值用null代替。
* 如果值多于键,忽略多余的值。
*
* @param 键类型
* @param 值类型
* @param keys 键列表
* @param values 值列表
* @return 标题内容Map
* @since 3.1.0
*/
public static Map toMap(Iterable keys, Iterable values) {
return toMap(keys, values, false);
}
/**
* 将键列表和值列表转换为Map
* 以键为准,值与键位置需对应。如果键元素数多于值元素,多余部分值用null代替。
* 如果值多于键,忽略多余的值。
*
* @param 键类型
* @param 值类型
* @param keys 键列表
* @param values 值列表
* @param isOrder 是否有序
* @return 标题内容Map
* @since 4.1.12
*/
public static Map toMap(Iterable keys, Iterable values, boolean isOrder) {
return toMap(null == keys ? null : keys.iterator(), null == values ? null : values.iterator(), isOrder);
}
/**
* 将键列表和值列表转换为Map
* 以键为准,值与键位置需对应。如果键元素数多于值元素,多余部分值用null代替。
* 如果值多于键,忽略多余的值。
*
* @param 键类型
* @param 值类型
* @param keys 键列表
* @param values 值列表
* @return 标题内容Map
* @since 3.1.0
*/
public static Map toMap(Iterator keys, Iterator values) {
return toMap(keys, values, false);
}
/**
* 将键列表和值列表转换为Map
* 以键为准,值与键位置需对应。如果键元素数多于值元素,多余部分值用null代替。
* 如果值多于键,忽略多余的值。
*
* @param 键类型
* @param 值类型
* @param keys 键列表
* @param values 值列表
* @param isOrder 是否有序
* @return 标题内容Map
* @since 4.1.12
*/
public static Map toMap(Iterator keys, Iterator values, boolean isOrder) {
final Map resultMap = MapUtil.newHashMap(isOrder);
if (isNotEmpty(keys)) {
while (keys.hasNext()) {
resultMap.put(keys.next(), (null != values && values.hasNext()) ? values.next() : null);
}
}
return resultMap;
}
/**
* 将列表转成值为List的HashMap
*
* @param iterable 值列表
* @param keyMapper Map的键映射
* @param 键类型
* @param 值类型
* @return HashMap
* @since 5.3.6
*/
public static Map> toListMap(Iterable iterable, Function keyMapper) {
return toListMap(iterable, keyMapper, v -> v);
}
/**
* 将列表转成值为List的HashMap
*
* @param iterable 值列表
* @param keyMapper Map的键映射
* @param valueMapper Map中List的值映射
* @param 列表值类型
* @param 键类型
* @param 值类型
* @return HashMap
* @since 5.3.6
*/
public static Map> toListMap(Iterable iterable, Function keyMapper, Function valueMapper) {
return toListMap(MapUtil.newHashMap(), iterable, keyMapper, valueMapper);
}
/**
* 将列表转成值为List的HashMap
*
* @param resultMap 结果Map,可自定义结果Map类型
* @param iterable 值列表
* @param keyMapper Map的键映射
* @param valueMapper Map中List的值映射
* @param 列表值类型
* @param 键类型
* @param 值类型
* @return HashMap
* @since 5.3.6
*/
public static Map> toListMap(Map> resultMap, Iterable iterable, Function keyMapper, Function valueMapper) {
if (null == resultMap) {
resultMap = MapUtil.newHashMap();
}
if (ObjectUtil.isNull(iterable)) {
return resultMap;
}
for (T value : iterable) {
resultMap.computeIfAbsent(keyMapper.apply(value), k -> new ArrayList<>()).add(valueMapper.apply(value));
}
return resultMap;
}
/**
* 将列表转成HashMap
*
* @param iterable 值列表
* @param keyMapper Map的键映射
* @param 键类型
* @param 值类型
* @return HashMap
* @since 5.3.6
*/
public static Map toMap(Iterable iterable, Function keyMapper) {
return toMap(iterable, keyMapper, v -> v);
}
/**
* 将列表转成HashMap
*
* @param iterable 值列表
* @param keyMapper Map的键映射
* @param valueMapper Map的值映射
* @param 列表值类型
* @param 键类型
* @param 值类型
* @return HashMap
* @since 5.3.6
*/
public static Map toMap(Iterable iterable, Function keyMapper, Function valueMapper) {
return toMap(MapUtil.newHashMap(), iterable, keyMapper, valueMapper);
}
/**
* 将列表转成Map
*
* @param resultMap 结果Map,通过传入map对象决定结果的Map类型
* @param iterable 值列表
* @param keyMapper Map的键映射
* @param valueMapper Map的值映射
* @param 列表值类型
* @param 键类型
* @param 值类型
* @return HashMap
* @since 5.3.6
*/
public static Map toMap(Map resultMap, Iterable iterable, Function keyMapper, Function valueMapper) {
if (null == resultMap) {
resultMap = MapUtil.newHashMap();
}
if (ObjectUtil.isNull(iterable)) {
return resultMap;
}
for (T value : iterable) {
resultMap.put(keyMapper.apply(value), valueMapper.apply(value));
}
return resultMap;
}
/**
* Iterator转List
* 不判断,直接生成新的List
*
* @param 元素类型
* @param iter {@link Iterator}
* @return List
* @since 4.0.6
*/
public static List toList(Iterable iter) {
if (null == iter) {
return null;
}
return toList(iter.iterator());
}
/**
* Iterator转List
* 不判断,直接生成新的List
*
* @param 元素类型
* @param iter {@link Iterator}
* @return List
* @since 4.0.6
*/
public static List toList(Iterator iter) {
final List list = new ArrayList<>();
while (iter.hasNext()) {
list.add(iter.next());
}
return list;
}
/**
* Enumeration转换为Iterator
*
* Adapt the specified Enumeration
to the Iterator
interface
*
* @param 集合元素类型
* @param e {@link Enumeration}
* @return {@link Iterator}
*/
public static Iterator asIterator(Enumeration e) {
return new EnumerationIter<>(e);
}
/**
* {@link Iterator} 转为 {@link Iterable}
*
* @param 元素类型
* @param iter {@link Iterator}
* @return {@link Iterable}
*/
public static Iterable asIterable(final Iterator iter) {
return () -> iter;
}
/**
* 获取集合的第一个元素
*
* @param 集合元素类型
* @param iterable {@link Iterable}
* @return 第一个元素
*/
public static T getFirst(Iterable iterable) {
if (null == iterable) {
return null;
}
return getFirst(iterable.iterator());
}
/**
* 获取集合的第一个元素
*
* @param 集合元素类型
* @param iterator {@link Iterator}
* @return 第一个元素
*/
public static T getFirst(Iterator iterator) {
if (null != iterator && iterator.hasNext()) {
return iterator.next();
}
return null;
}
/**
* 获得{@link Iterable}对象的元素类型(通过第一个非空元素判断)
* 注意,此方法至少会调用多次next方法
*
* @param iterable {@link Iterable}
* @return 元素类型,当列表为空或元素全部为null时,返回null
*/
public static Class> getElementType(Iterable> iterable) {
if (null != iterable) {
final Iterator> iterator = iterable.iterator();
return getElementType(iterator);
}
return null;
}
/**
* 获得{@link Iterator}对象的元素类型(通过第一个非空元素判断)
* 注意,此方法至少会调用多次next方法
*
* @param iterator {@link Iterator}
* @return 元素类型,当列表为空或元素全部为null时,返回null
*/
public static Class> getElementType(Iterator> iterator) {
final Iterator> iter2 = new CopiedIter<>(iterator);
if (iter2.hasNext()) {
final Object t = iter2.next();
if (null != t) {
return t.getClass();
}
}
return null;
}
/**
* 过滤集合,此方法在原集合上直接修改
* 通过实现Filter接口,完成元素的过滤,这个Filter实现可以实现以下功能:
*
*
* 1、过滤出需要的对象,{@link Filter#accept(Object)}方法返回false的对象将被使用{@link Iterator#remove()}方法移除
*
*
* @param 集合类型
* @param 集合元素类型
* @param iter 集合
* @param filter 过滤器接口
* @return 编辑后的集合
* @since 4.6.5
*/
public static , E> T filter(T iter, Filter filter) {
if (null == iter) {
return null;
}
filter(iter.iterator(), filter);
return iter;
}
/**
* 过滤集合,此方法在原集合上直接修改
* 通过实现Filter接口,完成元素的过滤,这个Filter实现可以实现以下功能:
*
*
* 1、过滤出需要的对象,{@link Filter#accept(Object)}方法返回false的对象将被使用{@link Iterator#remove()}方法移除
*
*
* @param 集合元素类型
* @param iter 集合
* @param filter 过滤器接口
* @return 编辑后的集合
* @since 4.6.5
*/
public static Iterator filter(Iterator iter, Filter filter) {
if (null == iter || null == filter) {
return iter;
}
while (iter.hasNext()) {
if (false == filter.accept(iter.next())) {
iter.remove();
}
}
return iter;
}
/**
* Iterator转换为Map,转换规则为:
* 按照keyFunc函数规则根据元素对象生成Key,元素作为值
*
* @param Map键类型
* @param Map值类型
* @param iterator 数据列表
* @param map Map对象,转换后的键值对加入此Map,通过传入此对象自定义Map类型
* @param keyFunc 生成key的函数
* @return 生成的map
* @since 5.2.6
*/
public static Map toMap(Iterator iterator, Map map, Func1 keyFunc) {
return toMap(iterator, map, keyFunc, (value) -> value);
}
/**
* 集合转换为Map,转换规则为:
* 按照keyFunc函数规则根据元素对象生成Key,按照valueFunc函数规则根据元素对象生成value组成新的Map
*
* @param Map键类型
* @param Map值类型
* @param 元素类型
* @param iterator 数据列表
* @param map Map对象,转换后的键值对加入此Map,通过传入此对象自定义Map类型
* @param keyFunc 生成key的函数
* @param valueFunc 生成值的策略函数
* @return 生成的map
* @since 5.2.6
*/
public static Map toMap(Iterator iterator, Map map, Func1 keyFunc, Func1 valueFunc) {
if (null == iterator) {
return map;
}
if (null == map) {
map = MapUtil.newHashMap(true);
}
E element;
while (iterator.hasNext()) {
element = iterator.next();
try {
map.put(keyFunc.call(element), valueFunc.call(element));
} catch (Exception e) {
throw new UtilException(e);
}
}
return map;
}
/**
* 返回一个空Iterator
*
* @param 元素类型
* @return 空Iterator
* @see Collections#emptyIterator()
* @since 5.3.1
*/
public static Iterator empty() {
return Collections.emptyIterator();
}
}