[JAVA] À vous à qui on a dit "Ne pas utiliser Stream API" dans le champ

La différence de température est grande. Je ne veux aller travailler que les jours chauds, mais je pense accepter la mauvaise routine d'aller travailler à l'heure parce que les gens n'ont pas à être paresseux en étant apprivoisés par des habitudes.

"L'abus de flux rend les programmes difficiles à comprendre et à maintenir."

Java 3ème édition efficace "L'abus de flux rend les programmes difficiles à comprendre et à maintenir"

Soudain, c'est la conclusion. Le code court et facile à lire est génial. Cependant, l'API Stream est également facile à générer du code court et ésotérique, du code long et ésotérique. Lorsqu'elle est mise en œuvre par quelqu'un qui ne comprend pas parfaitement l'API Stream, y compris moi-même, je dois toujours être conscient du risque de mauvaise lisibilité du programme. C'est un problème pour les programmeurs de terrain, et l'API Stream n'est pas mauvaise. Si vous souhaitez écrire l'API Stream, modifiez l'emplacement. Avant que le code concis de l'API Stream que vous avez implémenté ne se propage partout en raison d'abus par copier-coller et devient un problème.

Implémentation d'API Stream courte et facile à lire

Cependant, si cela se termine tel quel, je suis désolé pour certaines personnes qui sont toujours motivées pour étudier l'API Stream, donc je vais vous présenter le code qui rend l'API Stream plus lisible.

Supposons maintenant que vous souhaitiez savoir de quelles affaires sont responsables vos employés. Comment puis-je extraire ces informations à l'aide d'une liste de cas spécifique? En tant que politique de mise en œuvre, 1, acquisition du dossier 2, acquisition de la valeur à traiter comme une clé de l'enregistrement 3, créer une carte correspondant à la valeur de clé et enregistrer Sera. La mise en œuvre par Stream API est la suivante


/** 
*Implémentation par Stream API.
*Il s'agit simplement d'un code d'explication et n'implémente pas les opérations de connexion, la gestion des exceptions, etc.
*  @param salescodeList Une liste qui stocke les informations de code qui identifient le sujet.
*  @return <K, V> = {Code d'employé,Liste des projets en charge}
*/
public Map<Integer, List<Record>> getSalesListGroupingByEmployeeCode (List<Integer> salesCodeList) {
    List<Record> recordList = searchBySalesCodeList(salesCodeList);
    return recordList.stream().collect(
        Collectors.groupingBy(recordList::getEmployeeCode));
}

Premièrement, j'ai une liste de disques. Ensuite, créez la liste des enregistrements acquis dans un objet Stream. Vous pouvez désormais travailler avec le pipeline de flux. Voyons maintenant ce que nous voulons faire avec le pipeline de flux. 1, je souhaite collecter des flux dans une liste 2, je souhaite effectuer un regroupement (mappage) en utilisant le code d'employé comme clé La mise en œuvre serait donc:

//Extrait la pièce à l'aide de l'API Stream
recordList.stream(). //Convertir un objet List en objet Stream
    collect( //Déclarer collecter des objets de flux sous forme de liste
    Collectors.groupingBy( //Effectuer le regroupement
    recordList::getEmployeeCode) //Transmettez la valeur de clé utilisée pour le regroupement en argument
    );

Le StreamAPI se concentre sur «ce qu'il faut faire», donc un tel regroupement et fractionnement serait un bon exemple.

Implémentation sans API Stream

C'est un changement de direction lorsqu'il est implémenté par Stream API. Si vous interdisez l'API Stream et renvoyez la même valeur qu'avant, vous aurez probablement une implémentation comme celle-ci:


/** 
*Implémentations qui n'utilisent pas l'API Stream.
*Il s'agit simplement d'un code d'explication et n'implémente pas les opérations de connexion, la gestion des exceptions, etc.
*  @param salescodeList Une liste qui stocke les informations de code qui identifient le sujet.
*  @return <K, V> = {Code d'employé,Liste des projets en charge}
*/
public Map<Integer, List<SalesRecord>> getSalesListGroupingByEmployeeCode (List<Integer> salesCodeList) {
    //HashMap à utiliser comme valeur de retour de cette méthode
    Map<Integer, List<SalesRecord> result = new HashMap<>();

    List<SalesRecord> recordList = searchBySalesCodeList(salesCodeList);
    for (List<SalesRecord> record : recordList) {
        int employeeCode = record.getEmployeeCode();
        //Ici, déjà Clé-Déterminer si une paire de valeurs a été générée
        //Si une paire a été créée, la salesList peut être obtenue car la paire existe déjà dans le résultat.
        List<SalesRecord> salesList = result.get(employeeCode);
        
        //Si la paire n'existe pas, la liste qui stocke le sujet en charge ne peut pas être stockée, donc une liste est générée.
        if (salesList == null) {
            salesList = new ArrayList<>();
        }
        salesList.add(record);
        result.put(employeeCode, salesList);     
    }
    return result;
}

Le nombre de lignes a augmenté et ce que vous voulez faire n'est pas très clair.

Utiliser ou non l'API Stream

L'exemple d'implémentation présenté ici était un meilleur exemple à implémenter avec Stream. Cependant, certains devraient être implémentés avec une instruction for au lieu d'un Stream. S'il y a trop d'opérations intermédiaires dans le pipeline de flux, un certain fractionnement peut être nécessaire. Après tout, c'est "quel programmeur préfère". Ce n'est pas aussi clair que la dissimulation d'informations. Si vous êtes un partisan enthousiaste de l'API Stream et que vous avez des crises de colère lorsque l'on vous demande d '"arrêter l'API Stream" lors de l'examen du code contenant l'API Stream, vous n'êtes peut-être pas là. Dans ce cas, adoptez activement l'API Stream et déplacez-vous sur le site jusqu'à ce que vous trouviez un environnement capable de maintenir une qualité de code élevée.

Recommended Posts

À vous à qui on a dit "Ne pas utiliser Stream API" dans le champ
[java8] Pour comprendre l'API Stream
Utilisez-vous Stream en Java?
Essayez d'utiliser l'API Stream en Java
J'ai essayé de résumer l'API Stream
Le gars qui ne peut pas gérer les erreurs dans le flux
Vous pouvez ne pas vouloir utiliser la méthode remove sur ArrayList très souvent
Lorsque vous souhaitez utiliser la méthode à l'extérieur
Pour ceux qui souhaitent utiliser MySQL pour la base de données dans la construction de l'environnement de Rails6 ~.
Utiliser des expressions Java lambda en dehors de l'API Stream
[Rails] Je ne sais pas comment utiliser le modèle ...
Java: utilisez Stream pour trier le contenu d'une collection
Utilisez JLine lorsque vous souhaitez gérer les frappes sur la console caractère par caractère en Java
Utilisez collection_select pour extraire les données stockées dans Active_Hash
À vous qui êtes troublé par des points décimaux inattendus en Java
[À voir absolument pour l'apprenti ingénieur Java] Comment utiliser l'API Stream
Comment créer une partie d'espace réservé à utiliser dans la clause IN
Je souhaite utiliser l'API Java 8 DateTime lentement (maintenant)
Comment appeler et utiliser l'API en Java (Spring Boot)
Il est maintenant temps de commencer avec l'API Stream
J'étais étrangement accro à l'utilisation de l'API Stream de Java avec Scala
Que faire si la commande rails devient inutilisable
Si vous souhaitez simuler une méthode dans RSpec, vous devez utiliser la méthode allow pour mock et la méthode singleton.
Comment utiliser l'API Chain
API Java Stream en 5 minutes
[Java] Introduction à l'API Stream
[Rails / Routing] Comment faire référence au contrôleur dans votre propre répertoire
Si vous souhaitez inclure la classe parente dans @builder de Lombok
Examinons la signification de "stream" et "collect" dans l'API Stream de Java.
Exemple de code pour appeler l'API Yahoo! Local Search en Java
Que faire si vous oubliez votre mot de passe root sur CentOS7
Tirez parti de l'un ou l'autre pour la gestion des exceptions individuelles dans l'API Java Stream