IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Lire un fichier et extraire une Map


Sujet :

Collection et Stream Java

  1. #1
    Membre du Club Avatar de hadler
    Inscrit en
    Décembre 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2004
    Messages : 91
    Points : 63
    Points
    63
    Par défaut Lire un fichier et extraire une Map
    Bonjour à tous,

    Je débute avec les Stream et j'ai quelques questions. Je souhaite lire un fichier et obtenir un objet Map en sortie.

    Voici le contenu de mon fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1,ABC,111
    2,DEF,222
    3,GHI,333
    4,JKL,444
    5,MNO,555
    J'ai créé l'objet à instancier lors de la lecture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    public class TPP {
        private int id ;
        private String ref ;
        private String code ;
     
        public TPP (String line) {
            String[] content = line.split(",") ;
            id = Integer.valueOf(content [0]) ;
            ref = content[1] ;
            code = content[2] ;
        }
     
        public int getId() {
            return id;
        }
     
        public void setId(int id) {
            this.id = id;
        }
     
        public String getRef() {
            return ref;
        }
     
        public void setRef(String ref) {
            this.ref = ref;
        }
     
        public String getCode() {
            return code;
        }
     
        public void setCode(String code) {
            this.code = code;
        }
     
        @Override
        public int hashCode() {
            return (ref+code).hashCode();
        }
     
        public TPP getObject() {
            return this ;
        }
    }
    Pour lire le fichier, fais comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public Map<Integer, TPP> readTpp() throws Exception {
            List<TPP> setTpp = Files.lines(Paths.get("D:\\tpp.txt"))
                    .map(ligne -> ligne.split("\\s+")).flatMap(Arrays::stream)
                    .map(TPP::new)
                    .collect(Collectors.toList());
     
            return setTpp.stream().collect(Collectors.toMap(TPP::hashCode, TPP::getObject));
        }
    ça fonctionne bien, j'ai bien ma Map.

    Mais j'ai deux questions :
    - est ce qu'il y a un autre moyen que de créer la méthode getObjet pour ajouter mon Objet comme valeur de la Map ?
    - est ce qu'il y a moyen d'obtenir l'objet Map dès la lecture de fichier (sans passer par une liste intermédiaire)

    Merci d'avance pour votre aide.

  2. #2
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 325
    Points : 436
    Points
    436
    Par défaut
    Bonjour,

    Oui vous pouvez vous passer de la liste intermédiaire en faisant un au lieu de collecter vers une liste.

    La syntaxe est du sucre syntaxique pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    new Function<TPP, TPP>{
       TPP apply(TPP o) {
           return o;
       }
    }
    Qui peut aussi être exprimée via une lambda
    Au final, votre code peut-être traduit par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Files.lines(Paths.get("D:\\tpp.txt"))
        .map(ligne -> ligne.split("\\s+")).flatMap(Arrays::stream)
        .map(TPP::new)
        .collect(toMap(TPP::hashCode, (TPP o)->o);

  3. #3
    Membre du Club Avatar de hadler
    Inscrit en
    Décembre 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2004
    Messages : 91
    Points : 63
    Points
    63
    Par défaut
    Super, ça répond exactement à ma question.

    J'ai encore pas mal à faire pour bien comprendre et utiliser les lambdas et Stream.

  4. #4
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 325
    Points : 436
    Points
    436
    Par défaut
    Heureux d'avoir pu vous aider.

    N'oubliez pas de marquer la question comme résolue si possible.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lire les fichiers copiés d'une base de données
    Par zaac01 dans le forum Installation
    Réponses: 5
    Dernier message: 18/11/2007, 16h30
  2. Comment lire un fichier et extraire des données
    Par salut93 dans le forum MATLAB
    Réponses: 14
    Dernier message: 12/06/2007, 11h27
  3. Lire des fichiers à envoyer par une servlet
    Par loic911 dans le forum Langage
    Réponses: 1
    Dernier message: 30/04/2007, 16h31
  4. Réponses: 3
    Dernier message: 05/03/2007, 23h54
  5. Réponses: 3
    Dernier message: 19/02/2007, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo