Browse Source

!208 集合以及迭代器获取size的方法

Merge pull request !208 from HsinDumas/v5-dev
Looly 5 years ago
parent
commit
c40622d1cd

+ 49 - 0
hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java

@@ -21,6 +21,7 @@ import cn.hutool.core.util.ReflectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.TypeUtil;
 
+import java.lang.reflect.Array;
 import java.lang.reflect.Type;
 import java.util.AbstractCollection;
 import java.util.ArrayList;
@@ -2930,4 +2931,52 @@ public class CollUtil {
 		void accept(K key, V value, int index);
 	}
 	// ---------------------------------------------------------------------------------------------- Interface end
+
+    /**
+     * 获取Collection或者iterator的大小
+     * <p>
+     * 此方法可以处理的对象类型如下
+     * <ul>
+     * <li>Collection - the collection size
+     * <li>Map - the map size
+     * <li>Array - the array size
+     * <li>Iterator - the number of elements remaining in the iterator
+     * <li>Enumeration - the number of elements remaining in the enumeration
+     * </ul>
+     *
+     * @param object  可以为空的对象
+     * @return 如果object为空则返回0
+     * @throws IllegalArgumentException 参数object不是Collection或者iterator
+     * @since 5.4.8
+     */
+    public static int size(final Object object) {
+		if (object == null) {
+			return 0;
+		}
+		int total = 0;
+		if (object instanceof Map<?,?>) {
+			total = ((Map<?, ?>) object).size();
+		} else if (object instanceof Collection<?>) {
+			total = ((Collection<?>) object).size();
+		} else if (object instanceof Iterable<?>) {
+			total = IterUtil.size((Iterable<?>) object);
+		} else if (object instanceof Object[]) {
+			total = ((Object[]) object).length;
+		} else if (object instanceof Iterator<?>) {
+			total = IterUtil.size((Iterator<?>) object);
+		} else if (object instanceof Enumeration<?>) {
+			final Enumeration<?> it = (Enumeration<?>) object;
+			while (it.hasMoreElements()) {
+				total++;
+				it.nextElement();
+			}
+		} else {
+			try {
+				total = Array.getLength(object);
+			} catch (IllegalArgumentException e) {
+				throw new IllegalArgumentException("Unsupported object type: " + object.getClass().getName());
+			}
+		}
+		return total;
+    }
 }

+ 34 - 0
hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java

@@ -10,6 +10,7 @@ import cn.hutool.core.util.ReflectUtil;
 import cn.hutool.core.util.StrUtil;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -821,4 +822,37 @@ public class IterUtil {
 	public static <F, T> Iterator<T> trans(Iterator<F> iterator, Function<? super F, ? extends T> function) {
 		return new TransIter<>(iterator, function);
 	}
+
+	/**
+	 * 返回 Iterable 对象的元素数量
+	 *
+	 * @param iterable Iterable对象
+	 * @return Iterable对象的元素数量
+	 * @since 5.4.8
+	 */
+	public static int size(final Iterable<?> iterable) {
+		if (iterable instanceof Collection<?>) {
+			return ((Collection<?>) iterable).size();
+		} else {
+			return size(iterable != null ? iterable.iterator() : empty());
+		}
+	}
+
+	/**
+	 * 返回 Iterator 对象的元素数量
+	 *
+	 * @param iterator Iterator对象
+	 * @return Iterator对象的元素数量
+	 * @since 5.4.8
+	 */
+	public static int size(final Iterator<?> iterator) {
+		int size = 0;
+		if (iterator != null) {
+			while (iterator.hasNext()) {
+				iterator.next();
+				size++;
+			}
+		}
+		return size;
+	}
 }