Tout le monde aime l'API Stream, Les boucles comme l'écriture dans une instruction for étendue sont propres, Je ne sais pas quoi faire avec une boucle qui veut faire référence à l'index à l'intérieur de la boucle. (Il existe un moyen de créer votre propre classe même si vous en faites le tour: persévérez :)
Alors j'ai tourné un peu la tête.
Les cas suivants sont supposés être des "boucles qui veulent faire référence à l'index à l'intérieur de la boucle".
――Je veux tourner deux listes ou plus ensemble
--Je veux aussi faire référence à des éléments adjacents dans une liste (comme ʻi-1 ou ʻi + 1
pour ʻi`)
(Parce que vous pouvez faire référence à ʻi` et écrire votre processus préféré Il peut également être utilisé dans des cas tels que "Je souhaite modifier le processus au début / à la fin de la liste", Je pense que ce n'est pas très beau. )
Voici un exemple de code.
public static void main(String[] args) {
//Liste appropriée composée de nombres aléatoires
List<Integer> listA = new ArrayList<>(Arrays.asList(12, 23, 66, 45, 10, 48, 21, 25, 68, 65));
List<Integer> listB = new ArrayList<>(Arrays.asList(98, 96, 4, 33, 30, 38, 39, 25, 32, 64));
//Cas 1: si vous souhaitez gérer deux listes ensemble
List<Boolean> isWinnerA = IntStream.range(0, Math.min(listA.size(), listB.size()))
.mapToObj(i -> listA.get(i) > listB.get(i))
.collect(Collectors.toList());
System.out.println("isWinnerAList: " + isWinnerAList);
// -> isWinnerA: [false, false, true, true, false, true, false, false, true, true]
//Cas 2: Si vous souhaitez gérer le recto et le verso de la liste ensemble
List<Double> movingAverage = IntStream.range(0, listA.size() - 1)
.mapToObj(i -> (listA.get(i) + listA.get(i + 1)) / 2d)
.collect(Collectors.toList());
System.out.println("movingAverage: " + movingAverage);
// -> movingAverage: [17.5, 44.5, 55.5, 27.5, 29.0, 34.5, 23.0, 46.5, 66.5]
}
En tant que composition,
--for (int i; i <list.size (); i ++)
partie
--Créé avec la méthode d'usine de ʻIntStream --Pour une simple augmentation comme dans l'exemple, vous pouvez utiliser
range (startInclusive, endExclusive) --Si vous voulez changer la grandeur de l'incrément, ʻiterate (seed, f) .limit (maxSize)
(bien que vous puissiez vous référer à ʻi * 2`)
generate (s)
mapToObj (/ * processus de conversion * /) .collect (/ * processus d'agrégation * /);
--Si vous n'avez pas besoin d'agréger, vous pouvez utiliser forEach ()
.pro: vous ne pouvez écrire qu'avec les standards con: Stream Vous pouvez être confus si vous n'y êtes pas habitué
Est-il dit qu'il vaut mieux écrire normalement dans une phrase for?
Eh bien, si c'est celui utilisé dans l'exemple, cela peut être normal pour le document, mais peut-il être utilisé dans des cas tels que filter ()
, le traitement d'agrégation et les fonctions Stream? Je pense.
Recommended Posts