Bien que l'API Stream implémentée à partir de Java 8 soit une fonctionnalité très utile, Comme je suis souvent accro au traitement spécifique au Stream, je décrirai les contre-mesures
En gros, il suffit de se souvenir uniquement des modèles suivants -Convertir de collection en flux -Convertir du tableau et de l'argument de longueur variable en Stream -Appeler IntStream
Appel de flux de base
// Collection(List/Set etc.)dans le cas de
Collection<BigDecimal>list = List.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN);
Stream<BigDecimal>stream = list.stream();
//Pour les tableaux
BigDecimal[] array = new BigDecimal[] {BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN};
Stream<BigDecimal>stream = Stream.of(array);
//Pour les arguments de longueur variable(La même méthode que pour le tableau est OK)
Stream<BigDecimal>stream = Stream.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN);
//Lors du traitement de la boucle int * pour(int i=0; i<=100 i++)...Traitement équivalent
IntStream stream = IntStream.rangeClosed(0, 100);
Événements qui ont tendance à se produire au démarrage du Stream
Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
Le flux doit être converti (arrêté) en un autre type après le traitement Il est impossible de conserver / réutiliser l'état de Stream comme List
Le flux ne peut pas être réutilisé
Stream<String>stream = Stream.of("","","");
//Si vous faites quelque chose, le Stream se fermera (il n'y a pas de solution de contournement)
stream.collect(Collectors.toCollection(ArrayDeque::new));
//Les flux déjà fermés ne peuvent pas être réutilisés
stream.count();
//Trace de la pile
//Exception in thread "main" java.lang.IllegalStateException: stream has already been //operated upon or closed
// at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:229)
// at java.base/java.util.stream.ReferencePipeline.count(ReferencePipeline.java:538)
// at main.TestFunc.main(TestFunc.java:11)
Action 1: n'utilisez pas Stream pour les variables et les valeurs de retour. Convertir en flux à chaque fois en utilisant Collection (Liste, etc.) ou Map
Exemple de solution de contournement
//Après avoir mis la variable dans une collection...
List<BigDecimal> list = List.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN);
//Convertir en liste
Deque<BigDecimal> deque = list.stream().collect(Collectors.toCollection(ArrayDeque::new));
//Comptez le nombre. Créer un flux pour chaque processus
long count = list.stream().count();
Correspondance 2: (Exemple spécial) Les traitements tels que la moyenne, la somme et le nombre peuvent être traités collectivement.
Utilisation des statistiques sommaires
List<BigDecimal> list = List.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN);
//Convertir en statistiques récapitulatives. Il n'y a pas de statistiques récapitulatives décimales
IntSummaryStatistics summary = list.stream().collect(Collectors.summarizingInt(BigDecimal::intValueExact));
//Plusieurs résultats peuvent être obtenus à partir d'un processus Stream
summary.getMax();
summary.getAverage();
summary.getSum();
Par exemple, il n'y a pas de méthode à sum () pour Stream \
Exemple sans méthode correspondante
//Il n'y a pas de telle méthode
Stream.of(1,2,3).sum();
Correspondance 1 (pour ** type de base **): Utilisez un flux spécial dédié au type de base
Exemple de conversion vers IntStream
//Convertir en IntStream avec mapToInt → Utilisez la méthode qu'IntStream a spécialement
Stream.of(1, 2, 3).mapToInt(e -> e).sum();
Correspondance 2 (dans le cas de ** autre que le type de base **): Processus utilisant la méthode Stream ou Collector
Exemple d'ajout avec Decimal
//modèle 1:Traitement pour ajouter toutes les valeurs décimales dans Stream avec la valeur initiale 0=Effectue le processus de calcul du total. Méthode de traitement similaire à l'instruction for conventionnelle
Stream.of(1, 2, 3).map(BigDecimal::valueOf).reduce(BigDecimal.ZERO,BigDecimal::add);
//Motif 2:Préparez un collecteur et utilisez-le. Efficace lorsque vous souhaitez le réutiliser plusieurs fois
Collector<BigDecimal, ?, BigDecimal> sum = Collectors.reducing(BigDecimal.ZERO, BigDecimal::add);
Stream.of(1, 2, 3).map(BigDecimal::valueOf).collect(sum);
Stream.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN).collect(sum);
En gros, il suffit de se souvenir uniquement des modèles suivants -Convertir du flux à la collection -Convertir du flux au tableau
Conversion à partir du flux
// List(non spécifié)dans le cas de
List<BigDecimal> list = Stream.of(BigDecimal.ZERO, BigDecimal.ONE).limit(1).collect(Collectors.toList());
//Pour les autres collections
Deque<BigDecimal> deque = Stream.of(BigDecimal.ZERO, BigDecimal.ONE).limit(1).collect(Collectors.toCollection(LinkedList::new));
//Pour les tableaux
BigDecimal[] array = Stream.of(BigDecimal.ZERO, BigDecimal.ONE).limit(1).toArray(BigDecimal[]::new);
Dans la méthode FindFirst, le résultat peut être nul, nous le plaçons donc dans Facultatif et invitons le programmeur à définir ce qu'il faut faire lorsqu'il est nul. Dans l'état facultatif, il n'est pas possible de traiter le contenu (BigDecimal dans l'exemple ci-dessous) (BigDecimal.add () etc.). Pour le moment, il n'y a pas de méthode de traitement autre que Stream, il est donc facile de devenir accro.
Exemple de devoir gérer Facultatif
//Erreur···[Incompatibilité de type: Optional<BigDecimal>Ne peut pas être converti en BigDecimal]
BigDecimal first = Stream.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN).findFirst();
Correspondance: ajoutez une méthode pour extraire le contenu de Facultatif
Exemple de traitement Facultatif
//Si vous supposez également qu'il n'y a pas d'éléments(Cette fois, s'il n'y a pas d'élément, mettez-le à 0)
BigDecimal first = Stream.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN).findFirst().orElse(BigDecimal.ZERO);
//Lorsqu'il n'y a pas d'élément sauf si une anomalie se produit(Lancer NoSuchElementException)
BigDecimal first = Stream.<BigDecimal>of().findFirst().get();
//Lorsqu'il n'y a pas d'élément sauf si une anomalie se produit(Lancer l'exception spécifiée)
BigDecimal first = Stream.<BigDecimal>of().findFirst().orElseThrow(IllegalStateException::new);
Recommended Posts