Hola usuario de nuestro sitio web, encontramos la respuesta a tu interrogante, desplázate y la verás un poco más abajo.
Solución:
TL; DR: use el método de utilidad Iterables.size(Iterable)
de la gran biblioteca Guayaba.
De sus dos fragmentos de código, debe usar el primero, porque el segundo eliminará todos los elementos de values
, por lo que está vacío después. Cambiar una estructura de datos para una consulta simple como su tamaño es muy inesperado.
Para el rendimiento, esto depende de su estructura de datos. Si es, por ejemplo, de hecho, un ArrayList
eliminar elementos desde el principio (lo que está haciendo su segundo método) es muy lento (calcular el tamaño se convierte en O (n * n) en lugar de O (n) como debería ser).
En general, si existe la posibilidad de que values
es en realidad un Collection
y no solo un Iterable
marca esto y llama size()
en caso:
if (values instanceof Collection>)
return ((Collection>)values).size();
// use Iterator here...
la llamada a size()
generalmente será mucho más rápido que contar el número de elementos, y este truco es exactamente lo que Iterables.size(Iterable)
de guayaba hace por ti.
Si está trabajando con Java 8, puede usar:
Iterable values = ...
long size = values.spliterator().getExactSizeIfKnown();
solo funcionará si la fuente iterable tiene un tamaño determinado. La mayoría de Spliterators for Collections lo harán, pero es posible que tenga problemas si proviene de un HashSet
o ResultSet
por ejemplo.
Puede consultar el javadoc aquí.
Si Java 8 no es una opcióno si no sabe de dónde viene el iterable, puede usar el mismo enfoque que la guayaba:
if (iterable instanceof Collection)
return ((Collection>) iterable).size();
else
int count = 0;
Iterator iterator = iterable.iterator();
while(iterator.hasNext())
iterator.next();
count++;
return count;
Esto es quizás un poco tarde, pero puede ayudar a alguien. Me encuentro con un problema similar con Iterable
en mi base de código y la solución fue usar for each
sin llamar explícitamente values.iterator();
.
int size = 0;
for(T value : values)
size++;