添加对Collection和iterator获取size方法

This commit is contained in:
ZhongXin 2020-11-12 11:33:54 +08:00
parent 09d00f9fdf
commit 36d6e75017
2 changed files with 83 additions and 0 deletions

View File

@ -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;
}
}

View File

@ -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;
}
}