2017-09-28 9 views
-2

La situation est que je dois itérer sur un ensemble ayant une taille de 5000 éléments. Actuellement, j'utilise une boucle normale avec itérateur.Meilleure façon de parcourir un ensemble en Java

for (Iterator iterator = allValues.iterator(); iterator.hasNext();) { 

    ListMetadataElem element = (ListMetadataElem) iterator.next(); 
    NameValueObject value = new NameValueObject(); 
    value.setId(element.getListMetadataElemSeqId().toString());  
    value.setValue(element.getListMetadataElemNm()); 
    abstractVO.getAllListMetadataElems().add(value);  
} 

La question est la prendre trop de temps pour itérer comme 6-7 secondes et je dois appeler plusieurs fois la même boucle.

+0

Donnez une chance à ** Java 8 flux parallèle ** –

+0

Êtes-vous sûr que c'est l'itération qui prend le temps? 5000 éléments ne devraient prendre presque rien –

+0

Je n'utilise pas beaucoup Java, mais en Python, je m'attendrais à ce que l'itération sur un ensemble de '5000' éléments soit très rapide, et seulement une fraction infime de 6-7 secondes. Je ne peux que supposer que ce serait rapide en Java, et probablement beaucoup plus rapide. Je suppose que c'est ce qui se passe dans * dans votre boucle *, alors que fait exactement 'abstractVO.getAllListMetadataElems()', par exemple? –

Répondre

2

Voici les comparaisons:

public class IterateSet { 

    public static void main(String[] args) { 

     //example Set 
     Set<String> set = new HashSet<>(); 

     set.add("Jack"); 
     set.add("John"); 
     set.add("Joe"); 
     set.add("Josh"); 

     long startTime = System.nanoTime(); 
     long endTime = System.nanoTime(); 

     //using iterator 
     System.out.println("Using Iterator"); 
     startTime = System.nanoTime(); 
     Iterator<String> setIterator = set.iterator(); 
     while(setIterator.hasNext()){ 
      System.out.println(setIterator.next()); 
     } 
     endTime = System.nanoTime(); 
     long durationIterator = (endTime - startTime); 


     //using lambda 
     System.out.println("Using Lambda"); 
     startTime = System.nanoTime(); 
     set.forEach((s) -> System.out.println(s)); 
     endTime = System.nanoTime(); 
     long durationLambda = (endTime - startTime); 


     //using Stream API 
     System.out.println("Using Stream API"); 
     startTime = System.nanoTime(); 
     set.stream().forEach((s) -> System.out.println(s)); 
     endTime = System.nanoTime(); 
     long durationStreamAPI = (endTime - startTime); 


     //using Split Iterator (not recommended) 
     System.out.println("Using Split Iterator"); 
     startTime = System.nanoTime(); 
     Spliterator<String> splitIterator = set.spliterator(); 
     splitIterator.forEachRemaining((s) -> System.out.println(s)); 
     endTime = System.nanoTime(); 
     long durationSplitIterator = (endTime - startTime); 


     //time calculations 
     System.out.println("Iterator Duration:" + durationIterator); 
     System.out.println("Lamda Duration:" + durationLambda); 
     System.out.println("Stream API:" + durationStreamAPI); 
     System.out.println("Split Iterator:"+ durationSplitIterator); 
    } 
} 

Le code est explicite. Le résultat des durées sont:

Iterator Duration:495287 
Lamda Duration:50207470 
Stream API:2427392 
Split Iterator:567294 

On peut voir le Lambda est la plus longue en Iterator est le plus rapide. En dehors de cela, il y a la traditionnelle boucle renforcée pour l'âge.

+1

Donc environ 0,5 secondes pour un itérateur et 50 secondes pour Lamba - ne semble pas tout à fait correct –

+0

Ces valeurs sont-elles réellement référencées? – nullpointer

+0

@nullpointer J'ai copié les résultats exacts en exécutant le code. –

-1

Vous pouvez utiliser enhanced for loop ou pour chacun si vous utilisez java 8 ou supérieur. Je pense que pour chacun semble être bon par rapport à Iterator.