Java8 / 9 Beginners: Streaming API addiction points et comment les gérer

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

1. Je ne sais pas comment appeler Stream en premier lieu

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

2. Points addictifs qui ont tendance à se produire sans le savoir

É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

2.1: IllegalStateException se produit ... Le flux ne peut pas être réutilisé

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

2.2 Stream n'a pas de méthode spécifique au type

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

2.3 Je ne sais pas comment revenir à un tableau / une liste / une carte

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

2.4 Je ne sais pas comment gérer Facultatif

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

Java8 / 9 Beginners: Streaming API addiction points et comment les gérer
[Pour les débutants] Comment utiliser Stream API après Java 8
Comment utiliser l'API Java avec des expressions lambda
Comment créer une API avec GraphQL et Rails
[Java] Types de commentaires et comment les rédiger
[Java] Introduction à l'API Stream
[À voir absolument pour l'apprenti ingénieur Java] Comment utiliser l'API Stream
Comment gérer les exceptions froidement avec Java 8 Stream ou en option
Gérez les exceptions avec fraîcheur avec les expressions lambda Java 8 et l'API Stream
Comment appeler et utiliser l'API en Java (Spring Boot)
Convertir un tableau bidimensionnel au format csv avec l'API Java 8 Stream
Comment gérer différentes versions de rbenv et Ruby
[java8] Pour comprendre l'API Stream
[Java] Points à noter avec Arrays.asList ()
[Introduction à Java] À propos de l'API Stream
Java, des tableaux pour débuter avec les débutants
Java 8 ~ Stream API ~ pour commencer maintenant
Android: Comment gérer "Impossible de déterminer la version Java à partir de '10 .0.1 '"
Project facet Java version 13 n'est pas pris en charge. Comment faire avec
Comment compiler Java avec VsCode & Ant
[Java] Résumez comment comparer avec la méthode equals
[Android] Comment gérer les thèmes sombres
De nos jours, les expressions Java Lambda et l'API de flux
[Java] Comment sortir et écrire des fichiers!
Comment gérer les actifs de précompilation a échoué.
Comment convertir un tableau de chaînes en un tableau d'objets avec l'API Stream
Comment créer une application avec un mécanisme de plug-in [C # et Java]
twitter-4 sélections d'erreurs avec la fonction de connexion Twitter créée par omniauth gem et comment les traiter
Défi pour gérer les caractères déformés avec Java AudioSystem.getMixerInfo ()
[Java] Comment tester s'il est nul dans JUnit
[Java] Comment utiliser la classe FileReader et la classe BufferedReader
Essayez d'intégrer Ruby et Java avec Dapr
Comment utiliser le framework Java avec AWS Lambda! ??
API Java Stream
Comment utiliser le contrôle segmenté et les points à noter
Comment obtenir et étudier Java SE8 Gold
[Pour les débutants] À propos des expressions lambda et de l'API Stream
Comment accéder aux méthodes et champs Java Private
[Java] Comment utiliser la classe Calendar et la classe Date
[Docker] Comment mettre à jour à l'aide d'un conteneur dans Heroku et comment gérer l'erreur de migration
Comment appeler des fonctions en bloc avec la réflexion Java
Traitement des listes à comprendre avec des images - java8 stream / javaslang-
[Java] Comment omettre l'injection de constructeur de ressort avec Lombok
Comment déployer Java sur AWS Lambda avec Serverless Framework
[Session d'étude interne] Principes de base de l'expression Java-Lambda et de l'API Stream- (13/07/2017)
Comment traiter Aucun modèle de demande interactive
[Environnement Docker] Comment gérer ActiveSupport :: MessageEncryptor :: InvalidMessage
Comment lire la gestion de la mémoire Java et GC Viewer
[Java] Se référer et définir des variables privées avec réflexion
[Rails] Comment gérer les modifications d'URL après le rendu
Comment sérialiser et désérialiser le type LocalDateTime avec GSON
Je veux faire des transitions d'écran avec kotlin et java!
Résumé de l'API de communication Java (3) Comment utiliser SocketChannel