Pages

jeudi 14 février 2013

Retour sur le first Ninjackaton sur les Lambda Expressions

Mardi 12 février, l'entreprise Ninja Squad organisait à Lyon une soirée baptisée Ninjackaton, sur les Lambdas nouveautés arrivant avec la version Java 8 prévue pour la fin d'année

L'équipe Ninja Squad

Je ne l'ai pas encore fait sur ce blog, mais cet article est l'occasion de présenter les 4 mousquetaires... euh pardon ninjas... qui composent ninja squad. J'ai eu la chance de travailler pour des durées plus ou moins courtes avec les 4 (en gros de 2 mois à 12 ans...). Je dois dire qu'ils sont tous talentueux dans leur domaine et qu'ils se complètent bien pour former une équipe de choc.

Ce n'est pas donné à toutes les entreprises d'avoir dans ses rangs
  • une Java champion
  • un top user de stack overflow 
  • deux jugs leader
  • une leader du user group duchess France (Il faut aussi de même noté que ninja-squad est une des rares sociétés informatiques qui peut se targuer d'avoir 25 % de femmes dans son effectif et dans le comité de direction...)
  • trois des quatre fondateurs du blog cast-it
  • trois leaders de la team Mix-it
  • une personne qui a dit à Google non je ne vendrai pas mon âme pour vendre de la pub...
Si je devais les présenter en quelques mots je dirai
  • Agnès l'ambassadrice Java agile 
  • Jean Baptiste le maître jedi du développement
  • Cédric le passionné des nouvelles technos
  • Cyril le passionné des problèmes complexes à développer
Ah oui tiens je me répète j'ai dit deux fois passionnés... mais je crois que ce mot caractérise bien nos 4 ninjas.

Parlons Java 

Cette soirée était donc dédiée aux expressions Lambdas qui arrivent dans la version 8 de Java. Nous avons commencé par une présentation théorique avant de faire un TP sur les différentes Lambdas expressions utilisables sur une List.

Une expression Lambda désigne une fonction anonyme dans votre code.

Actuellement en Java nous pouvons définir des classes anonymes, classe déclarée et instanciée en même temps sans définir de nom (pour plus d'info je vous laisse lire cet article). Par exemple nous utilisons ci dessous l'interface Function de Guava

@Test
public void lengthMapping() {
    Function<String, Integer> lengthMapper = new Function<String, Integer>() {
          public Integer apply(String s) {
               return Strings.nullToEmpty(s).length();
          }
    };
    Assertions.assertThat(lengthMapper.apply("Hello World")).isEqualTo(11);
}

Avec les lambda expression introduites dans Java 8, on pourra écrire

@Test
public void lengthMapping() {
      Function<String, Integer> lengthMapper = (String s) -> Strings.nullToEmpty(s).length();
      Assertions.assertThat(lengthMapper.apply("Hello World")).isEqualTo(11);
}

ou

@Test
public void lengthMapping2() {
      Function<String, Integer> lengthMapper = s -> Strings.nullToEmpty(s).length();
      Assertions.assertThat(lengthMapper.apply("Hello World")).isEqualTo(11);
}

Même si l'écriture du code est un peu difficile au départ le résultat est tout de même beaucoup plus concis et lisible qu'auparavant. Pour info les lambdas expressions sont utilisables dans de nombreux langages de programmation.

Programmation fonctionnelle

Les lambdas expressions permettent d'aller vers de la programmation fonctionnelle comme nous pouvions le faire actuellement avec la librairie Guava.

Dans la programmation fonctionnelle une portion de code peut être vue comme un emboîtement de fonctions que l'on peut imbriquer les unes dans les autres. Les fonctions peuvent être vues comme des boites noires acceptant plusieurs paramètres mais n'en renvoyant qu'un seul en sortie.

En prenant un exemple des slides des ninjas

List<Person> result = 
     Person.NINJA_SQUAD
          .stream()
          .filter(p -> p.getGender() == Person.Gender.MALE)
          .sorted(Comparators .<Person, String>comparing(Person::getLastName)
               .thenComparing(Person::getFirstName))
          .substream(0, 2)
          .collect(Collectors.toList());


Techniquement

Techniquement une nouvelle annotation a été introduite @FunctionalInterface, que vous pouvez placer sur une interface qui ne contient qu'une seule méthode. Cette méthode pourra ainsi être utilisée comme Lambda expression. Pour assurer la propagation de ces fonctionnalités dans les librairies existantes le compilateur généralise son utilisation sur toutes les interfaces n'ayant qu'une seule méthode.

Vous pouvez par exemple continuer à utiliser Guava en bénéficiant des simplifications de syntaxe. La JEP (JDK Enhancement Proposal) 126 liée aux Lambdas expressions introduit également d'autres éléments comme l'inférence de type (le compilateur pourra déduire la nature d'une variable de type primitif sans devoir la déclarer) ou les static méthodes dans les interfaces.

Il est possible de déclarer des implémentations par défaut d'une méthode dans une interface. Ce procédé a permis par exemple de faire évoluer l'interface List sans devoir redéfinir toutes les classes implémentant l'interface. Cette fonctionnalité est certes pratique pour assurer la rétrocompatibilité de certains frameworks mais c'est aussi une porte ouverte aux mauvaises pratiques comme l'héritage multiple.

Les autres nouveautés de Java 8

On a beaucoup parlé du report de l'intégration du projet jigsaw dans le JDK (modularité du JDK) dans les versions futures du langage, mais le scope de cette version 8 est tout de même assez fourni. La version 8 apportera plus de nouvelles fonctionnalités que la version 7. Vous pouvez voir la liste à cette url.

Je citerai ici
  • Les lambdas expressions que l'on vient de voir
  • Evolution des Date time en s'inspirant de Jodatime
  • La suppression du permgen space qui va simplifier les langages dynamiques tel que Groovy par exemple
  • Nashorn moteur javacript intégré dans le JDK
  • ...
En conclusion

Cette soirée était très agréable et s'est déroulée dans une bonne ambiance grâce à tous les participants mais aussi grâce à la disponibilité des speakers. Si vous voulez voir les slides ou accéder aux TP je vous laisse consulter le blog des ninjas à l'adresse suivante.

Je dois dire que je suis très content d'avoir pu plonger le temps d'une soirée dans les lambda expression et je pense qu'il va me falloir un peu de temps avant que l'écriture de ces lambdas me soit intuitive. Merci aux ninjas pour cette soirée...

1 commentaire:

  1. Super Guigui, sentiment partagé sur cette soirée vraiment sympathique, et aussi il faut le dire, studieuse. Ça a quand même chauffé dans la tête de pas mal de monde. TP vraiment bien travaillé et réussi. Et puis, le buffet, ah la la. On attend le prochain anniversaire...
    Enfin voila mon ressenti.

    RépondreSupprimer

Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.