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

cn.hutool.core.collection.IterUtil Maven / Gradle / Ivy

There is a newer version: 5.8.33
Show newest version
package cn.hutool.core.collection;

import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.Editor;
import cn.hutool.core.lang.Filter;
import cn.hutool.core.lang.Matcher;
import cn.hutool.core.lang.func.Func1;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.text.StrJoiner;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Dictionary;
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.Objects;
import java.util.function.Consumer;
import java.util.function.Function;

/**
 * {@link Iterable} 和 {@link Iterator} 相关工具类
 *
 * @author Looly
 * @since 3.1.0
 */
public class IterUtil {

	/**
	 * 获取{@link Iterator}
	 *
	 * @param iterable {@link Iterable}
	 * @param       元素类型
	 * @return 当iterable为null返回{@code null},否则返回对应的{@link Iterator}
	 * @since 5.7.2
	 */
	public static  Iterator getIter(Iterable iterable) {
		return null == iterable ? null : iterable.iterator();
	}

	/**
	 * 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) {
		return null == getFirstNoneNull(iter);
	}

	/**
	 * 根据集合返回一个元素计数的 {@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) { T t; while (iter.hasNext()) { t = iter.next(); countMap.put(t, countMap.getOrDefault(t, 0) + 1); } } return countMap; } /** * 字段值与列表值对应的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 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(getIter(iterable), 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 为分隔符将集合转换为字符串
* 如果集合元素为数组、{@link Iterable}或{@link Iterator},则递归组合其为字符串 * * @param 集合元素类型 * @param iterator 集合 * @param conjunction 分隔符 * @return 连接后的字符串 */ public static String join(Iterator iterator, CharSequence conjunction) { return StrJoiner.of(conjunction).append(iterator).toString(); } /** * 以 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) { return StrJoiner.of(conjunction, prefix, suffix) // 每个元素都添加前后缀 .setWrapElement(true) .append(iterator) .toString(); } /** * 以 conjunction 为分隔符将集合转换为字符串
* 如果集合元素为数组、{@link Iterable}或{@link Iterator},则递归组合其为字符串 * * @param 集合元素类型 * @param iterator 集合 * @param conjunction 分隔符 * @param func 集合元素转换器,将元素转换为字符串 * @return 连接后的字符串 * @since 5.6.7 */ public static String join(Iterator iterator, CharSequence conjunction, Function func) { if (null == iterator) { return null; } return StrJoiner.of(conjunction).append(iterator, func).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) { return ListUtil.toList(iter); } /** * Enumeration转换为Iterator *

* Adapt the specified {@code Enumeration} to the {@code 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; } /** * 遍历{@link Iterator},获取指定index位置的元素 * * @param iterator {@link Iterator} * @param index 位置 * @param 元素类型 * @return 元素,找不到元素返回{@code null} * @since 5.8.0 */ public static E get(final Iterator iterator, int index) throws IndexOutOfBoundsException { if(null == iterator){ return null; } Assert.isTrue(index >= 0, "[index] must be >= 0"); while (iterator.hasNext()) { index--; if (-1 == index) { return iterator.next(); } iterator.next(); } return null; } /** * 获取集合的第一个元素,如果集合为空(null或者空集合),返回{@code null} * * @param 集合元素类型 * @param iterable {@link Iterable} * @return 第一个元素,为空返回{@code null} */ public static T getFirst(Iterable iterable) { if (iterable instanceof List) { final List list = (List) iterable; return CollUtil.isEmpty(list) ? null: list.get(0); } return getFirst(getIter(iterable)); } /** * 获取集合的第一个非空元素 * * @param 集合元素类型 * @param iterable {@link Iterable} * @return 第一个元素 * @since 5.7.2 */ public static T getFirstNoneNull(Iterable iterable) { if (null == iterable) { return null; } return getFirstNoneNull(iterable.iterator()); } /** * 获取集合的第一个元素 * * @param 集合元素类型 * @param iterator {@link Iterator} * @return 第一个元素 */ public static T getFirst(Iterator iterator) { return get(iterator, 0); } /** * 获取集合的第一个非空元素 * * @param 集合元素类型 * @param iterator {@link Iterator} * @return 第一个非空元素,null表示未找到 * @since 5.7.2 */ public static T getFirstNoneNull(Iterator iterator) { return firstMatch(iterator, Objects::nonNull); } /** * 返回{@link Iterator}中第一个匹配规则的值 * * @param 数组元素类型 * @param iterator {@link Iterator} * @param matcher 匹配接口,实现此接口自定义匹配规则 * @return 匹配元素,如果不存在匹配元素或{@link Iterator}为空,返回 {@code null} * @since 5.7.5 */ public static T firstMatch(Iterator iterator, Matcher matcher) { Assert.notNull(matcher, "Matcher must be not null !"); if (null != iterator) { while (iterator.hasNext()) { final T next = iterator.next(); if (matcher.match(next)) { return next; } } } return null; } /** * 获得{@link Iterable}对象的元素类型(通过第一个非空元素判断)
* 注意,此方法至少会调用多次next方法 * * @param iterable {@link Iterable} * @return 元素类型,当列表为空或元素全部为null时,返回null */ public static Class getElementType(Iterable iterable) { return getElementType(getIter(iterable)); } /** * 获得{@link Iterator}对象的元素类型(通过第一个非空元素判断)
* 注意,此方法至少会调用多次next方法 * * @param iterator {@link Iterator},为 {@code null}返回{@code null} * @return 元素类型,当列表为空或元素全部为{@code null}时,返回{@code null} */ public static Class getElementType(Iterator iterator) { if (null == iterator) { return null; } final Object ele = getFirstNoneNull(iterator); return null == ele ? null : ele.getClass(); } /** * 编辑,此方法产生一个新{@link ArrayList}
* 编辑过程通过传入的Editor实现来返回需要的元素内容,这个Editor实现可以实现以下功能: * *

	 * 1、过滤出需要的对象,如果返回null表示这个元素对象抛弃
	 * 2、修改元素对象,返回集合中为修改后的对象
	 * 
* * @param 集合元素类型 * @param iter 集合 * @param editor 编辑器接口, {@code null}表示不编辑 * @return 过滤后的集合 * @since 5.7.1 */ public static List edit(Iterable iter, Editor editor) { final List result = new ArrayList<>(); if (null == iter) { return result; } T modified; for (T t : iter) { modified = (null == editor) ? t : editor.edit(t); if (null != modified) { result.add(modified); } } return result; } /** * 过滤集合,此方法在原集合上直接修改
* 通过实现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 过滤器接口,删除{@link Filter#accept(Object)}为{@code false}的元素 * @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; } /** * 过滤{@link Iterator}并将过滤后满足条件的元素添加到List中 * * @param 元素类型 * @param iter {@link Iterator} * @param filter 过滤器,保留{@link Filter#accept(Object)}为{@code true}的元素 * @return ArrayList * @since 5.7.22 */ public static List filterToList(Iterator iter, Filter filter) { return toList(filtered(iter, filter)); } /** * 获取一个新的 {@link FilterIter},用于过滤指定元素 * * @param iterator 被包装的 {@link Iterator} * @param filter 过滤断言,当{@link Filter#accept(Object)}为{@code true}时保留元素,{@code false}抛弃元素 * @param 元素类型 * @return {@link FilterIter} * @since 5.8.0 */ public static FilterIter filtered(final Iterator iterator, final Filter filter) { return new FilterIter<>(iterator, filter); } /** * 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(); } /** * 按照给定函数,转换{@link Iterator}为另一种类型的{@link Iterator} * * @param 源元素类型 * @param 目标元素类型 * @param iterator 源{@link Iterator} * @param function 转换函数 * @return 转换后的{@link Iterator} * @since 5.4.3 */ public static Iterator trans(Iterator iterator, Function function) { return new TransIter<>(iterator, function); } /** * 返回 Iterable 对象的元素数量 * * @param iterable Iterable对象 * @return Iterable对象的元素数量 * @since 5.5.0 */ public static int size(Iterable iterable) { if (null == iterable) { return 0; } if (iterable instanceof Collection) { return ((Collection) iterable).size(); } else { return size(iterable.iterator()); } } /** * 返回 Iterator 对象的元素数量 * * @param iterator Iterator对象 * @return Iterator对象的元素数量 * @since 5.5.0 */ public static int size(Iterator iterator) { int size = 0; if (iterator != null) { while (iterator.hasNext()) { iterator.next(); size++; } } return size; } /** * 判断两个{@link Iterable} 是否元素和顺序相同,返回{@code true}的条件是: *
    *
  • 两个{@link Iterable}必须长度相同
  • *
  • 两个{@link Iterable}元素相同index的对象必须equals,满足{@link Objects#equals(Object, Object)}
  • *
* 此方法来自Apache-Commons-Collections4。 * * @param list1 列表1 * @param list2 列表2 * @return 是否相同 * @since 5.6.0 */ public static boolean isEqualList(Iterable list1, Iterable list2) { if (list1 == list2) { return true; } final Iterator it1 = list1.iterator(); final Iterator it2 = list2.iterator(); Object obj1; Object obj2; while (it1.hasNext() && it2.hasNext()) { obj1 = it1.next(); obj2 = it2.next(); if (false == Objects.equals(obj1, obj2)) { return false; } } // 当两个Iterable长度不一致时返回false return false == (it1.hasNext() || it2.hasNext()); } /** * 清空指定{@link Iterator},此方法遍历后调用{@link Iterator#remove()}移除每个元素 * * @param iterator {@link Iterator} * @since 5.7.23 */ public static void clear(Iterator iterator) { if (null != iterator) { while (iterator.hasNext()) { iterator.next(); iterator.remove(); } } } /** * 遍历{@link Iterator}
* 当consumer为{@code null}表示不处理,但是依旧遍历{@link Iterator} * * @param iterator {@link Iterator} * @param consumer 节点消费,{@code null}表示不处理 * @param 元素类型 * @since 5.8.0 */ public static void forEach(final Iterator iterator, final Consumer consumer) { if (iterator != null) { while (iterator.hasNext()) { final E element = iterator.next(); if (null != consumer) { consumer.accept(element); } } } } /** * 拼接 {@link Iterator}为字符串 * * @param iterator {@link Iterator} * @param 元素类型 * @return 字符串 * @since 5.8.0 */ public static String toStr(final Iterator iterator) { return toStr(iterator, ObjectUtil::toString); } /** * 拼接 {@link Iterator}为字符串 * * @param iterator {@link Iterator} * @param transFunc 元素转字符串函数 * @param 元素类型 * @return 字符串 * @since 5.8.0 */ public static String toStr(final Iterator iterator, final Function transFunc) { return toStr(iterator, transFunc, ", ", "[", "]"); } /** * 拼接 {@link Iterator}为字符串 * * @param iterator {@link Iterator} * @param transFunc 元素转字符串函数 * @param delimiter 分隔符 * @param prefix 前缀 * @param suffix 后缀 * @param 元素类型 * @return 字符串 * @since 5.8.0 */ public static String toStr(final Iterator iterator, final Function transFunc, final String delimiter, final String prefix, final String suffix) { final StrJoiner strJoiner = StrJoiner.of(delimiter, prefix, suffix); strJoiner.append(iterator, transFunc); return strJoiner.toString(); } /** * 从给定的对象中获取可能存在的{@link Iterator},规则如下: *
    *
  • null - null
  • *
  • Iterator - 直接返回
  • *
  • Enumeration - {@link EnumerationIter}
  • *
  • Collection - 调用{@link Collection#iterator()}
  • *
  • Map - Entry的{@link Iterator}
  • *
  • Dictionary - values (elements) enumeration returned as iterator
  • *
  • array - {@link ArrayIter}
  • *
  • NodeList - {@link NodeListIter}
  • *
  • Node - 子节点
  • *
  • object with iterator() public method,通过反射访问
  • *
  • object - 单对象的{@link ArrayIter}
  • *
* * @param obj 可以获取{@link Iterator}的对象 * @return {@link Iterator},如果提供对象为{@code null},返回{@code null} */ public static Iterator getIter(final Object obj) { if (obj == null) { return null; } else if (obj instanceof Iterator) { return (Iterator) obj; } else if (obj instanceof Iterable) { return ((Iterable) obj).iterator(); } else if (ArrayUtil.isArray(obj)) { return new ArrayIter<>(obj); } else if (obj instanceof Enumeration) { return new EnumerationIter<>((Enumeration) obj); } else if (obj instanceof Map) { return ((Map) obj).entrySet().iterator(); } else if (obj instanceof NodeList) { return new NodeListIter((NodeList) obj); } else if (obj instanceof Node) { // 遍历子节点 return new NodeListIter(((Node) obj).getChildNodes()); } else if (obj instanceof Dictionary) { return new EnumerationIter<>(((Dictionary) obj).elements()); } // 反射获取 try { final Object iterator = ReflectUtil.invoke(obj, "iterator"); if (iterator instanceof Iterator) { return (Iterator) iterator; } } catch (final RuntimeException ignore) { // ignore } return new ArrayIter<>(new Object[]{obj}); } }