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

avec Java Discussion :

Java 8 - besoin d'explication du code


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de geforce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    1 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 055
    Par défaut Java 8 - besoin d'explication du code
    Hello voila,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    		final int [] scrabbleENScore = {
                         //a, b, c,  e, f,  g, h,  i, j, k,l,m,n,o,p,
    			1, 3, 3, 2, 1, 4, 2, 4,1,8,5,1,3,1,1,
    		};
     
    		Function<String, Integer> score =
    			word -> word.chars().map(letter -> scrabbleENScore[letter - 'a']).sum();
     
    		ToIntFunction<String> intScore =
    			word -> word.chars().map(letter -> scrabbleENScore[letter - 'a']).sum();
     
    		System.out.println("Score of hello: " + intScore.applyAsInt("hello"));
    Je ne suis pas ete sur de tout comprendre, encore moins l'expression map avec "letter - 'a'", fait je me dis comment il est possible de mapper deux liste indépendante ? aussi que fait applyAsInt (en fait en generale que signifie la méthode apply dans un context de consumer java 8)?

    Merci!

  2. #2
    Membre émérite
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Par défaut
    Salut,

    Pour commencer applyAsInt : ce n'est pas un consumer, c'est une function. En faiteles deux fonction score et intScore sont strictement identique. La seconde est simplement une IntFunction, qui etend Function. Elle assure juste que le retour soit un int. Function a normalement une methode R apply(T), surcharge en int applyToInt(T). Cela permet davoir une primitive en retour d'une fonction notamment.
    Quant au map, cest plutot simple. La function fait un Stream de character a partir du mot. Elle soustrait le codepoint de 'a' a celui du character courant pour obtenir un index dans le tableau, qui retourne donc le nombre de point de la lettre. Elle fait ensuite la somme des points.

    J'espère être clair...

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Au passage, ce n'est pas étonnant que tu aies du mal avec ce code. C'est à mon avis un beau gros cas d'abus de lambda et de FunctionalInterface. Je serais curieux de voir comment intScore et score sont utilisés dans le code. Il y a peut être une justification à ça.


    Ces deux interfaces ont le même code: c'est donc déjà une mauvaise pratique de le dupliquer. Pourquoi on les duplique? Parce qu'on veux stocker dans une variable une Functon et une IntFunction. Or les functionalInterface n'ont d'intérêt que pour les passer en argument à des méthodes / constructeur / Streams. On peut donc très biens regrouper ce code dans une seule méthode qu'on passe en référence à l'appel qui en a besoin. Ici, il aurait a minima fallu créer une méthode plutôt qu'une instance Function. Plus léger, plus lisible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public int score(String word){
        return word.chars()
            .map(letter -> scrabbleENScore[letter - 'a'])
            .sum();
    }
    ensuite: créer un stream de char, créer une lamba récupérant un index dans un tableau et lancer tout le bousin, je suis ne suis pas fan dans le cas présent. Le code suivant est bien plus léger et plus lisible selon moi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public int score (String word){
        int result = 0;
        for (char c : word.getChars()){
            // todo: check invalid values
            result += scrabbleENScore[letter - 'a']; 
        }
        return result;
    }

Discussions similaires

  1. [Python 3.X] requests // DDL fichier // besoin d'explication du code
    Par jer666 dans le forum Général Python
    Réponses: 6
    Dernier message: 08/08/2016, 18h58
  2. besoin explication partie code, svp.
    Par lolymeupy dans le forum ASP.NET
    Réponses: 3
    Dernier message: 03/08/2007, 13h59
  3. [PHP-JS] Besoin d'explication de code
    Par mastertiger dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2007, 23h16
  4. besoin d'explications sur un code
    Par NAHIAG dans le forum C
    Réponses: 8
    Dernier message: 28/05/2006, 12h37
  5. Besoin d'explications sur un bout de code
    Par zizitop dans le forum C
    Réponses: 7
    Dernier message: 26/04/2005, 14h51

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