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

Langage Java Discussion :

Découvrons Java 8 ensemble !


Sujet :

Langage Java

  1. #61
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Pour ce parallel, je me demande s'il y aura effectivement création de thread a la demande ou s'il y aura une sorte de pool global à la JVM un peu comme en .Net (la classe ThreadPool qui s'utilise statiquement).

  2. #62
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    A première vue il semblerait que ce soit le cas.
    Les threads sont nommés "ForkJoinPool.commonPool-worker-X" ce qui semble indiquer qu'ils utilisent le framework ForkJoin de Java 7 avec un pool commun.

    D'ailleurs la javadoc de ForkJoinPool et ForkJoinPool.commonPool() semble le confirmer...


    a++

  3. #63
    Rédacteur
    Avatar de CyaNnOrangehead
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2008
    Messages : 777
    Par défaut
    Bon j'ai fait mes petits essais avec le JDK8. Dommage que netbeans ne reconnaisse pas déjà les lambdas.

    Sinon voilà la concision obtenu avec ma petite librairie maison React4J
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Var<String> mouseAndTime = MouseReact.button1()
    		.map(arg1->arg1 ? "button pressed" : "button released")
    		.toVar("no button yet !")
    		.merge(mouseX, (arg1, arg2)->arg1 + " ( x=" + arg2)
    		.merge(mouseY, (arg1, arg2)->arg1 + ", y=" + arg2 + ")");
     
    label1.setText(mouseAndTime);
    On dit merci les lambdas....
    Retrouvez tous mes tutoriels : http://caron-yann.developpez.com/

    Et mon projet en cours : Algoid - programming language

    N'oubliez pas de consulter les FAQ Java (http://java.developpez.com/faq/) et les cours et tutoriels Java (http://java.developpez.com/cours/)

  4. #64
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par CyaNnOrangehead Voir le message
    Dommage que netbeans ne reconnaisse pas déjà les lambdas.
    Netbeans 7.4 les gère très bien.
    J'ai fait tous mes essai avec


    Il te propose même de convertir les classes anonymes en lambda.


    a++

  5. #65
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 746
    Par défaut
    Il me semblais que depuis la version 6, Netbeans essayait de suivre la numérotation des versions majeures du JDK. Bizarre qu'il ne l'ait pas nommé 8.0. Le support du JDK 8.0 est il complet?

  6. #66
    Rédacteur
    Avatar de CyaNnOrangehead
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2008
    Messages : 777
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Netbeans 7.4 les gère très bien.
    J'ai fait tous mes essai avec


    Il te propose même de convertir les classes anonymes en lambda.


    a++
    Ca vas trop vite !!!! Je ne suis jamais à jour. Terrible.
    Je télécharge la bête de ce pas. merci
    En tous cas, niveau code source ça change pas mal la donne pour utiliser ma lib. Je suis assez content. En plus comme c'est retro-compatible, ça ne m'a pas demandé beaucoup de changement.... merci Oracle (mince je me rend compte que je ne m’imaginais jamais dire un truc pareil !!!! )
    Retrouvez tous mes tutoriels : http://caron-yann.developpez.com/

    Et mon projet en cours : Algoid - programming language

    N'oubliez pas de consulter les FAQ Java (http://java.developpez.com/faq/) et les cours et tutoriels Java (http://java.developpez.com/cours/)

  7. #67
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Uther Voir le message
    Il me semblais que depuis la version 6, Netbeans essayait de suivre la numérotation des versions majeures du JDK. Bizarre qu'il ne l'ait pas nommé 8.0. Le support du JDK 8.0 est il complet?
    Aucune idée pour la numérotation.
    Mais ils attendent peut-être la sortie officielle du JDK8...

    Quand au support, il me semblait assez complet.
    En même temps contrairement à eclipse il me semble que Netbeans utilise directement le compilateur javac du JDK...


    a++

  8. #68
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Des slides de Devoxx : "Autumn Collections, From Iterable to Lambdas, Streams and Collectors"

    http://fr.slideshare.net/jpaumard/au...and-collectors


    a++

  9. #69
    Rédacteur
    Avatar de CyaNnOrangehead
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2008
    Messages : 777
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Des slides de Devoxx : "Autumn Collections, From Iterable to Lambdas, Streams and Collectors"

    http://fr.slideshare.net/jpaumard/au...and-collectors


    a++
    Au fait ! Pour résumer ce que dit José Paumard, les lambdas permettent une programmation déclarative plutôt qu'impérative.
    Ils permettent, dans le cas des listes (mais également de évènements (FRP), IO etc.) de programmer le quoi plutôt que le comment !

    Dans sa démo, sa fonction de réduction calcul la somme. Il pourrait directement calculer la moyenne à l'aide d'une suite. Mais ça sous entends d'entretenir un index.
    Retrouvez tous mes tutoriels : http://caron-yann.developpez.com/

    Et mon projet en cours : Algoid - programming language

    N'oubliez pas de consulter les FAQ Java (http://java.developpez.com/faq/) et les cours et tutoriels Java (http://java.developpez.com/cours/)

  10. #70
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Des slides de Devoxx : "Autumn Collections, From Iterable to Lambdas, Streams and Collectors"

    http://fr.slideshare.net/jpaumard/au...and-collectors
    superbe! ça c'est un exposé selon mon coeur!
    la technique est expliquée par les besoins.

  11. #71
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Je viens de tomber sur ce bout de code sur la mailling-list du projet lambda.
    Il consiste à rechercher toutes les méthodes par défaut des interfaces d'un fichier jar passé en paramètre (rt.jar par exemple) :
    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
    public class AllDefaultMethods {
     
        private static Class<?> loadClassFromFileName(String name) {
            String className = name.substring(0, name.length()
                    - ".class".length());
            try {
                return Class.forName(className.replace('/', '.'));
            } catch (Throwable t) {
                // skip unknown class, or LinkageError
                return null;
            }
        }
     
        public static void main(String... args) throws IOException {
            try (JarFile jarFile = new JarFile(args[0])) {
                jarFile.stream()
                        .map(JarEntry::getName)
                        .filter(name -> name.endsWith(".class"))
                        .map(AllDefaultMethods::loadClassFromFileName)
                        .filter(Objects::nonNull)
                        .flatMap(type -> Arrays.stream(type.getDeclaredMethods()))
                        .filter(Method::isDefault)
                        .forEach(System.out::println);
            }
        }
    }
    Mis à part la méthode loadClassFromFileName(), tout est fait via l'API de Stream, via JarFile qui propose un stream() sur ses entrées (JarEntry).

    Pour chaque JarEntry :
    • map(JarEntry::getName) récupère le nom du fichier.
    • filter(name -> name.endsWith(".class")) filtre seulement les fichiers *.class
    • map(AllDefaultMethods::loadClassFromFileName) tente de charger la Class correspondante (ou renvoi null en cas d'erreur)
    • filter(Objects::nonNull) permet donc d'ignorer les classes qui n'ont pas pu être chargée.
    • flatMap(type -> Arrays.stream(type.getDeclaredMethods())) récupère les Methods de la classe.
    • filter(Method::isDefault) filtre seulement les méthode par défaut.
    • Et enfin forEach(System.out::println) affiche la méthode dans System.out

    Il manque juste un filter(Class::isInterface) pour limiter la recherche de méthodes par défaut dans les interfaces...

    Simple !


    Pour info, en Java 7 un code similaire s'écrierait comme cela :
    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
        public static void main(String... args) throws IOException {
            try (JarFile jarFile = new JarFile(args[0])) {
                Enumeration<JarEntry> entries = jarFile.entries();
                while (entries.hasMoreElements()) {
                    String name = entries.nextElement().getName();
                    if (name.endsWith(".class")) {
                        Class<?> clazz = AllDefaultMethods.loadClassFromFileName(name);
                        if (clazz!=null) {
                            for (Method method : clazz.getDeclaredMethods()) {
                                if (method.isDefault()) {
                                    System.out.println(method);
                                }
                            }
                        }
                    }
                }
            }
        }

    a++

  12. #72
    Rédacteur
    Avatar de CyaNnOrangehead
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2008
    Messages : 777
    Par défaut
    abiGuda, tu te rend compte que ton second code est plus court que le premier

    Te chari. Les lambdas c'est plus élégant !
    Tien jete un oeil là dessus : http://www.developpez.net/forums/d13...s-langage-sql/

    Si tu remplace :
    - Select par map
    - Where par filter
    - (orderby, max, min, count, average) par reduce

    On comprend pourquoi LINQ a été mis en place et surtout sur quoi la réflexion c'est elle basée.
    Retrouvez tous mes tutoriels : http://caron-yann.developpez.com/

    Et mon projet en cours : Algoid - programming language

    N'oubliez pas de consulter les FAQ Java (http://java.developpez.com/faq/) et les cours et tutoriels Java (http://java.developpez.com/cours/)

  13. #73
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par CyaNnOrangehead Voir le message
    abiGuda, tu te rend compte que ton second code est plus court que le premier
    Non. Il est malgré tout légèrement plus court en plus d'être plus lisible
    C'est juste que je n'ai pas répété la méthode loadClassFromFileName() dans le second code... mais elle y est aussi utilisé


    Et oui le principe des Stream est similaire à celui des requêtes SQL




    Sinon les "checked-exceptions" seront encore plus emmerdante avec Java 8 et les lambdas, puisqu'il faut que les interfaces fonctionnelles définissent ces exceptions pour qu'elles soient utilisable.

    Par exemple, si je veux récupérer les noms/emails de certains utilisateurs afin de préparer un mailing.
    Pour afficher cela sur la console il n'y a aucun soucis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        List<User> users = ...
        users.stream()
            .filter(User::isOptin)
            .filter(u -> u.getEmail()!=null )
            .map(u -> u.getName() + "\t" + u.getEmail())
            .forEach(System.out::println);

    Maintenant, si je veux stocker cela dans un fichier via un Writer, je ne peux pas le faire directement car l'exception ne peut pas être utilisée dans forEach puisque l'interface Consumer ne déclare pas d'exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        List<User> users = ...
        try (Writer out = new FileWriter("out.txt")) {
            users.stream()
                .filter(User::isOptin)
                .filter(u -> u.getEmail()!=null )
                .map(u -> u.getName() + "\t" + u.getEmail())
                .forEach(out::append); // ERROR : incompatible throws type IOException
        }

    Pas cool


    a++

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/12/2011, 18h06
  2. Les ensembles en Java
    Par Malek_moly dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 28/01/2011, 16h29
  3. Réponses: 1
    Dernier message: 17/04/2009, 10h03
  4. [Java 5] Récuperer un ensemble d'annotations
    Par Shogun dans le forum Langage
    Réponses: 2
    Dernier message: 03/10/2007, 13h27
  5. Réponses: 9
    Dernier message: 11/05/2007, 17h43

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