TL; DR: utilizza il metodo Iterables.size(Iterable)di utilità della grande libreria Guava .
Dei tuoi due frammenti di codice, dovresti usare il primo, perché il secondo rimuoverà tutti gli elementi da values, quindi sarà vuoto in seguito. La modifica di una struttura dati per una query semplice come la sua dimensione è molto inaspettata.
Per le prestazioni, questo dipende dalla struttura dei dati. Se ad esempio è an ArrayList, rimuovere gli elementi dall'inizio (quello che sta facendo il tuo secondo metodo) è molto lento (il calcolo della dimensione diventa O (n * n) invece di O (n) come dovrebbe essere).
In generale, se esiste la possibilità che valuessia effettivamente un Collectione non solo un Iterable, controllare questo e chiamare size()nel caso:
if (values instanceof Collection<?>) {
return ((Collection<?>)values).size();
}
La chiamata a size()di solito è molto più veloce di contare il numero di elementi, e questo trucco è esattamente quello Iterables.size(Iterable)di Guava fa per voi.