J'ai deux méthodes identiques à l'exception de la direction d'index de boucle.
La boucle dans methodA
attend indexBegin
La boucle dans methodB attend
indexBegin> indexEnd
pour qu'il décrémente i de indexBegin à indexEnd.
public void methodA(int indexBegin, int indexEnd, List<Double> values) { for (int i = indexBegin; i <= indexEnd; i++) { ... } } public void methodB(int indexBegin, int indexEnd, List<Double> values) { for (int i = indexBegin; i >= indexEnd; i--) { ... } }
Y a-t-il un moyen de consolider la logique de boucle ici en utilisant un itérateur donc je n'ai qu'une seule méthode? J'ai encore besoin de garder une trace des index.
4 Réponses :
Dans java-8, vous pouvez utiliser IntStream.iterate ou Stream.iterate avec la combinaison de limit
pour générer une séquence par incrément ou décrément order, vous pouvez donc avoir une méthode en passant IntStream
comme argument
IntStream.iterate(0, i->i<10, i->i+1).forEach(System.out::println); IntStream.iterate(10, i->i>0, i->i-1).forEach(System.out::println);
ou
public void utilMethod(IntStream range, List<Double> values) { range.forEach(i->i); }
Exemple:
IntStream.iterate(0,i->i+1).limit(10).forEach(System.out::println); IntStream.iterate(10,i->i-1).limit(10).forEach(System.out::println);
À partir de java-9, vous pouvez utiliser IntStream.iterate ou Stream.iterate pour générer une séquence par incrément ou décrémentation
public void utilMethod(Stream<Integer> range, List<Double> values) { range.forEach(i->i); }
Exemple
public void utilMethod(IntStream range, List<Double> values) { range.forEach(i->i); }
Vous pouvez sélectionner les indices de manière à toujours itérer de la limite inférieure à la limite supérieure.
int begin = indexBegin > indexEnd ? indexEnd : indexBegin; int end = indexBegin > indexEnd ? indexBegin: indexEnd; for (int i = begin ; i <= end ; i++) { ... }
Que diriez-vous de passer à une boucle while et de déclarer les deux? De cette façon, vous pouvez accéder à l'un ou l'autre dans la méthode.
int countingUp = indexBegin; int countingDown = indexEnd; while (countingUp < indexEnd) { . . . countingUp++; countingDown--; }
Vous pouvez utiliser l'opérateur ternaire dans la boucle for comme ceci:
public void method(int indexBegin, int indexEnd, List<Double> values) { int direction = indexEnd - indexBegin ; for (int i = indexBegin; direction > 0 ? i<=indexEnd : i>=indexEnd; i= direction>0 ? i+1:i-1) { ... } }
Changez simplement les valeurs d'indexBegin et d'indexEnd ainsi que la valeur d'incrémentation?