Devoxx France 2015 Jour 3 : Java 8 in Anger

J’ai assisté cette année à mon premier Devoxx et je souhaitais faire un retour sur ma conférence préférée de la journée de vendredi, celle sur Java 8 de Trisha Gee.

Je ne suis pas biaisée, mais ce serait difficile de ne pas avoir appréciée une conférence par une de mes compatriotes !

Trisha a commencé par nous expliquer que « Java 8 in Anger » ne voulait pas dire qu’elle allait coder de manière fâchée (!) mais simplement qu’elle allait nous montrer comment utiliser Java 8 dans une vraie application, au lieu de présenter des exemples statiques sur des slides.

Sa présentation était donc sous la forme d’une séance de live coding, qui, malgré quelques moments de tension et le fameux « effet démo », était très réussie.

Elle a construit un tableau de bord Twitter, composé de trois parties :

  • un classement des « top tweeters »,
  • un diagramme en camembert pour représenter l’humeur globale des utilisateurs,
  • un histogramme des changements d’humeur dans le temps.

Elle a procédé par étapes, utilisant dans un premier temps des services bouchonnés avec des données « en dur » afin d’atteindre rapidement un rendu graphique opérationnel, et se dotant dans un deuxième temps de vrais services qui interrogeaient une source de données réelles qu’elle avait récupérées de Twitter.

JavaFX

Pour la partie affichage, elle a utilisé JavaFX qui est fourni avec Java 8. C’était intéressant d’avoir un aperçu de cette technologie « en supplément » du thème principal de la présentation. Voici les points forts de JavaFX qu’elle a soulignés :

  • Une séparation claire des aspects « vue », dans les fichiers .fxml, et des styles, dans des fichiers .css,
  • Tout est compris dans le package, sans qu’on ait besoin de rajouter des briques extérieures,
  • Certains éléments, tels que le redimensionnement, sont inclus d’emblée sans qu’on ait besoin de les gérer explicitement.

A plusieurs moments pendant la démonstration elle a fait exprès de modifier l’aspect visuel du tableau de bord (couleurs, police, étiquettes de l’histogramme…), et les changements se faisaient très facilement avec JavaFX.

Java 8

Du côté de Java 8 « pur », voici les principales nouveautés qu’elle a abordées, avec des exemples d’utilisation dans le contexte de la construction du tableau de bord Twitter :

  • Les lambdas expressions
  • Les streams
  • La classe utilitaire Collectors
  • Les nouveautés de l’interface Comparator (comparing(...), reversed())

Exemple : extraire l’humeur (les « moods ») d’un tweet et retourner le résultat sous forme d’un set.

Set<Mood> messageMoods = MOOD_INDICATORS.stream()
        .filter(moodIndicator -> message.contains(moodIndicator.indicator))
        .map((MoodIndicator moodIndicator) -> moodIndicator.mood)
        .collect(Collectors.toSet());

Exemple : obtenir une liste triée des meilleurs « tweeters », en respectant un nombre maximal.

List<TwitterUser> topTwitterUsers = allTwitterUsers.values().stream()
        .sorted(comparing(TwitterUser::getTweets).reversed())
        .limit(NUMBER_OF_LEADERS)
        .collect(Collectors.toList());
  • La nouvelle date/heure API java.util.time
  • La méthode IntStream.range(start, end)
  • La méthode forEach()
  • Les « method references »

Exemple : initialiser les barres de l’histogramme à une valeur zéro sur une plage de 10 minutes, en commençant à la minute actuelle.

int nowMinute = LocalTime.now().getMinute();
range(nowMinute, nowMinute + 10).forEach(this::initialiseBarToZero);
  • La méthode Files.lines(path), ajout Java 8 à l’API I/O java.nio.file introduite en Java 7
  • La méthode peek()

Exemple : lire les lignes d’un fichier contenant les tweets, ajoutant une micro pause lors du traitement de chaque ligne retenue après un filtrage sur le contenu.

try (Stream<String> lines = Files.lines(filePath)) {
    lines.filter(message -> !message.equals("OK"))
            .peek(s -> addArtificialDelay())
            .forEach(tweetsEndpoint::onMessage);
}

J’ai apprécié de voir des exemples concrets de comment utiliser les différentes nouveautés de Java 8, et en particulier sa logique de toujours commencer par coder la version « ancienne », qu’elle faisait ensuite transformer en Java 8 à l’aide de son IDE (IntelliJ). L’outil de refactoring proposé par IntelliJ semble être très utile pour nous aider à apprendre les nouvelles constructions.

Lien vers les slides de la présentation et les ressources : http://trishagee.github.io/presentation/java8_in_anger/