web-dev-qa-db-fra.com

Comment itérer x fois en utilisant le flux Java 8?

J'ai une boucle de style for ancienne pour effectuer des tests de charge:

For (int i = 0 ; i < 1000 ; ++i) {
  if (i+1 % 100 == 0) {
    System.out.println("Test number "+i+" started.");
  }
  // The test itself...
}

Comment utiliser la nouvelle API de flux Java 8 pour pouvoir le faire sans la variable for?

En outre, l'utilisation du flux faciliterait le passage au flux parallèle. Comment passer en flux parallèle?

* J'aimerais garder la référence à i.

5
AlikElzin-kilaka
IntStream.range(0, 1000)
         /* .parallel() */
         .filter(i -> i+1 % 100 == 0)
         .peek(i -> System.out.println("Test number " + i + " started."))
         /* other operations on the stream including a terminal one */;

Si le test est en cours d'exécution à chaque itération, quelle que soit la condition (supprimez la variable filter):

IntStream.range(0, 1000)
         .peek(i -> {
             if (i + 1 % 100 == 0) {
                 System.out.println("Test number " + i + " started.");
             }
         }).forEach(i -> {/* the test */});

Une autre approche (si vous souhaitez parcourir un index avec une étape prédéfinie, telle que @Tunaki mentionne) est la suivante:

IntStream.iterate(0, i -> i + 100)
         .limit(1000 / 100)
         .forEach(i -> { /* the test */ });

Il existe une méthode surchargée Stream.iterate(seed, condition, unaryOperator) dans JDK 9 qui s'adapte parfaitement à votre situation et qui est conçue pour finaliser un flux et peut remplacer une for simple:

Stream<Integer> stream = Stream.iterate(0, i -> i < 1000, i -> i + 100);
12
Andrew Tobilko

Vous pouvez utiliser IntStream comme indiqué ci-dessous et expliqué dans les commentaires:

(1) Iterate IntStream va de 1 à 1000

(2) convertir en flux parallel

(3) Appliquer la condition Predicate pour autoriser les entiers avec (i+1)%100 == 0

(4) Convertissez maintenant l'entier en chaîne "Test number "+i+" started."

(5) Sortie vers la console

IntStream.range(1, 1000). //iterates 1 to 1000
   parallel().//converts to parallel stream
   filter( i -> ((i+1)%100 == 0)). //filters numbers & allows like 99, 199, etc..)
   mapToObj((int i) -> "Test number "+i+" started.").//maps integer to String
   forEach(System.out::println);//prints to the console
1
developer