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
.
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);
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