Obtendo o tamanho de um iterável em Java

Obtendo o tamanho de um iterável em Java

1. Visão geral

Neste tutorial rápido, aprenderemos sobre as várias maneiras pelas quais podemos obter o tamanho de umIterable em Java.

2. Iterável e Iterador

Iterable é uma das principais interfaces das classes de coleção em Java.

A interfaceCollection estendeIterable e, portanto, todas as classes filhas deCollection também implementamIterable.

Iterable tem apenas um método que produz umhttps://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html:

public interface Iterable {
    public Iterator iterator();
}

EsteIterator pode então ser usado para iterar sobre os elementos emIterable.

3. Tamanho iterável usando Core Java

3.1. loopfor-each

Todas as classes que implementamIterable são elegíveis para o loopfor-each em Java.

Isso nos permite fazer um loop sobre os elementos emIterable enquanto incrementamos um contador para obter seu tamanho:

int counter = 0;
for (Object i : data) {
    counter++;
}
return counter;

3.2. Collection.size()

Na maioria dos casos,Iterable será uma instância deCollection, , comoList ouSet.

Nesses casos, podemos verificar o tipo deIterablee chamar o métodosize() nele para obter o número de elementos.

if (data instanceof Collection) {
    return ((Collection) data).size();
}

A chamada parasize() geralmente é muito mais rápida do que iterar por toda a coleção.

Aqui está um exemplo que mostra a combinação das duas soluções acima:

public static int size(Iterable data) {

    if (data instanceof Collection) {
        return ((Collection) data).size();
    }
    int counter = 0;
    for (Object i : data) {
        counter++;
    }
    return counter;
}

3.3. Stream.count()

Se estivermos usando Java 8, podemos criar umStream a partir deIterable.

O objeto stream pode então ser usado para obter a contagem de elementos emIterable.

return StreamSupport.stream(data.spliterator(), false).count();

4. Tamanho iterável usando bibliotecas de terceiros

4.1. IterableUtils#size()

A bibliotecaApache Commons Collections tem uma boa classeIterableUtils que fornece métodos utilitários estáticos para instâncias deIterable.

Antes de começar, precisamos importar as dependências mais recentes deMaven Central:


    org.apache.commons
    commons-collections4
    4.1

Podemos invocar o métodosize() deIterableUtils em um objetoIterable para obter seu tamanho.

return IterableUtils.size(data);

4.2. Iterables#size()

Da mesma forma, a bibliotecaGoogle Guava também fornece uma coleção de métodos utilitários estáticos em sua classeIterables para operar em instânciasIterable.

Antes de começar, precisamos importar as dependências mais recentes deMaven Central:


    com.google.guava
    guava
    25.0

Invocar o métodosize() estático na classeIterables nos dá o número de elementos.

return Iterables.size(data);

Sob o capô,IterableUtils eIterables usam a combinação de abordagens descritas em 3.1 e 3.2 para determinar o tamanho.

5. Conclusão

Neste artigo, vimos diferentes maneiras de obter o tamanho de umIterable em Java.

O código-fonte deste artigo e os casos de teste relevantes estão disponíveisover on GitHub.