Recherche

Coder's IO

Tag

Lambda

JinQ : Requêtes SQL et Java8

 
 
 
La librairie dont nous allons parler a la particularité d'utiliser les nouveautés de la dernière version du JDK.
Elle a été créée par Dr Ming-Yee lu + pour son projet de recherche lorsqu'il était à l'EPFL.
 
JinQ a pour objectif de fournir une manière simple et naturelle d'écrire des requêtes vers une base de données en Java.
 
JinQ propose une syntaxe basée sur le paradigme de la programmation fonctionnelle, apporté par Java 8. 
Une requête écrite avec JinQ ressemblerait à ça :  
 
database.countryStream().where(
  country-> country.getName().equals("France"));
  
On s'aperçoit de la puissance de la syntaxe en terme de lisibilité et de concision. La ligne ci-dessus sélectionne l'ensemble des pays qui ont comme nom : "France". 
On trouve la possibilité d'écrire du code concis et clair. L'exemple donné ci-dessus est assez simpliste, on peut écrire des choses plus complexes de manière très élégante.

Un des avantages de la librairie est que la requête est écrite en Java natif. Ce qui permet au moment de la compilation de vérifier la validité de la requête.
 
Pour son fonctionnement, JinQ a besoin d'un mapping entre les entités et la base de données (via un fichier xml ou via une description JPA). Ensuite une phase de génération du code instrumenté.
Cette phase de description et génération est très simple à mettre en œuvre.

Aujourd'hui, le framework ne permet de faire que de la lecture. Il propose toutes les fonctionnalités de jointure, d'agrégation, de mapping, etc…
Dans une architecture basée sur le pattern CQRS, cet outil trouverait sa place dans la partie Query.

Ce projet est très jeune  (v 0.1), même si l'on ne peut pas l'utiliser directement en prod, il présente le véritable intérêt d'utiliser les nouveautés du JDK8 (lambda, Stream). Il offre des perspectives intéressantes.

Un projet à suivre…

#java8 #Jinq #orm #lambda

Java 8 : Les lambdas par l’exemple

 

Java 8 est sorti ! Ce n'est plus une grande nouvelle… 
Maintenant, plus d'excuses pour ne pas utiliser cette nouvelle version du langage.
Comme nous avons pu le voir au travers de précédents articles. pas mal de nouveautés sont arrivées avec ce nouvel opus.

Parmi ces nouveautés : les expressions lambdas
Cette nouvelle fonctionnalité permet de déclarer en ligne des fonctions. Il était possible de faire quelque chose de similaire auparavant au moyen d'une classe anonyme. L'inconvénient était le nombre de lignes qu'il fallait écrire avant de réellement implémenter le code métier. Avec les lambdas, une ligne suffit..

Pour bien comprendre le mécanisme et la valeur apportée par ce mécanisme (inspiré en partie du monde de la programmation  fonctionnelle), je vous propose l'article attaché à ce post qui décrit 10 exemples mettant en œuvre les expressions lambdas.

Les exemples que vous pourrez découvrir sont : 

– Implémentation d'un thead
– Implémentation d'un listener d'évènement
– Parcourir une liste
– Utilisation de l'interface Predicate de manière fonctionnelle
– Créer une combinaison de Predicate
– Implémentation d'un Map Reduce
– Création d'une liste de String via un filtre
– Appliquer une fonction sur chaque élément d'une liste
– Création d'un sous-liste
– Calcule du Max, Min, moyenne et somme sur une liste d'élément.

Pour les personnes qui découvrent cette syntaxe, cela peut être déroutant voir même pas très intuitif. 
Si vous prenez le temps de bien comprendre, cela vous ouvrira de nouvelles perspectives.

Bonne lecture !

#java #lambda #version8

Java au (futur) quotidien : Stream

 

La nouvelle version du JDK vient avec son lot de nouveautés.
Une des plus importantes est l'ajout des lambda expressions. 

Des évolutions significatives ont aussi été introduites autour de l'API Collections.
Ces évolutions fournissent une approche fonctionnelle de la manipulation d'ensembles de données. 

La question de la refonte de l'API Collections au sein du JDK s'est posée au moment de la version 8 de java.
Une des solutions aurait été de la refondre intégralement. 
Une autre option a été choisie en enrichissant les interfaces Collection, List, Iterable de nouvelles méthodes et en ajoutant de nouvelles interfaces comme l'interface Stream.

Un point important est le choix d'internaliser le mécanisme d'itération sur un ensemble de données.
Aujourd'hui, pour itérer sur une collection, nous n'avons pas d'autres choix que de le faire de manière séquentielle et selon l'ordre défini par la collection à parcourir.
En règle générale, c'est à l'aide d'une structure forEach, comme celle présentée ci-dessous, que l'on parcourt une collection : 

for(Object o : objects){
/do something/
}

D'autres alternatives existent à l'aide d'api externe comme Guava, LambdaJ , commons-collections

Dans la version 8, le mécanisme d'itération a été internalisé. Ci-dessous un exemple de comment serait codé le parcours d'une liste : 

objects.stream().forEach(/do something/);

Dans cet exemple, objects est une collection d'objets. Stream() est l'une des méthodes venant enrichir l'API existante.

Cette internalisation permet de déléguer la gestion de l'itération à l'API. De cette manière, il est possible de mettre en place des mécanismes permettant d'optimiser ou rationnaliser les traitements. par exemple : 

– mise en place de la parallélisation,
– exécution paresseuse de traitement,
– le chainage des appels,
– etc.

Du fait de cette internalisation, il est possible de chaîner les traitements que l'on souhaite appliquer à une collection.

Soit le use case suivant:
Sur une collection de personne, je souhaite appliquer un traitement particulier sur toutes les personnes ayant pour métier pompier. 

personnes.stream().filter(p -> p.metier==POMPIER)
 .forEach(p -> /do something/);

L'exemple est ici très simple, mais l'on peut faire des choses plus compliquées et ceci de manière très explicite et concise. Vous trouverez dans l'article en lien d'autres exemples.

Lors de l'utilisation des lambda expressions, celles-ci sont traduites en instance d'interface à une méthode. Le JDK propose un jeu d'interface utilisé par les expressions lambda, ci-dessous un exemple de ces interfaces : 

-Predicate : permet de filtrer selon une condition
-Block : permet d'appliquer un block de code.
-Function : permet de transformer un élément de la liste.

Parallélisation
Cette nouvelle version propose une fonctionnalité intéressante qui permet de se démarquer de l'approche séquentielle que l'on connait bien dans la version actuelle.
Cette fonctionnalité est la parallélisation des traitements appliqués sur une collection.

De plus, la mise en œuvre est très simple et transparente : 

personnes.stream().parallel().filter(p -> p.metier==POMPIER)
 .forEach(p -> /do something/);

Comme nous pouvons le voir sur l'exemple ci-dessus, il suffit d'appeler la méthode parallel() lors du chainage des traitements.
Ce mécanisme se base sur le projet fork/join. L'idée est de subdiviser l'ensemble des données en sous-ensembles et de traiter ces sous-ensembles.

Gestion des références null
L'équipe a décidé de ne pas gérer nativement les éléments null d'une collection. Cette gestion est laissée à la main du développeur. 
Il est vrai qu'avec cette nouvelle syntaxe, il est possible de rapidement les traiter en appliquant une fonction filter() au début du chainage des traitements.

Une autre particularité de l'interface Stream est qu'elle définit des ensembles de données non bornées. En effet, une collection standard correspond à un ensemble d'une taille finie.
Cette notion est importante et doit être bien gardée à l'esprit.

Nous avons fait un tour d'horizon des possibilités qui seront offertes avec Java 8 dans le domaine de la manipulation de collections. Nous avons vu ici les grandes lignes des possibilités offertes par l'interface Stream (couplée aux expressions lambdas).

Des perspectives vraiment séduisantes ! 

#java #stream #lambda #java8 #fonctionnelle

Les lambdas expliquées par des Ninjas !

 

L’équipe Ninja Squad va fêter sa demi année d’existence. A cette occasion, l’équipe lance un évènement le mardi 12 février à 19h à la Cordée de Charpennes, à Lyon.

L’idée de cet évènement est d’organiser la présentation d’un sujet suivi d’un workshop afin d’approfondir.

Le sujet choisi : Les lambda du futur JDK8.

Cette soirée est l’occasion de partager un bon moment entre passionnés et aussi d’en apprendre un peu plus sur le sujet.

Vous trouverez plus de détails sur le lien joint au post.

#java #lambda #ninjasquad #conference

ParisJug : rendez-vous le 13 mars

La prochaine soirée du ParisJug annoncée pour le 13 mars s’annonce passionnante.
Comme d’habitude, la soirée sera découpée en deux actes.
Le première partie sera présentée par +Alexis Moussine-Pouchkine. Il parlera de l’actualité de java principalement au travers des sujets suivants :
– La situation de Java 7 et 8,
– OpenJDK,
-JCP,
– etc

Puis il abordera un sujet plus technique, une fonctionnalité très attendue par les développeurs : Jigsaw.
Ce projet Jigsaw a pour objectif d’intégrer la notion de modularité au sein de Java.

L’intérêt de cette fonctionnalité est de s’affranchir de l’aspect monolithique du langage et de rendre les applications plus légères d’un manière générale.
Par contre, pour que cette fonctionnalité soit efficace et performante, cela implique une refonte importante afin que la plateforme Java elle-même soit modulaire.

La deuxième partie de la soirée, présentée par Rémi Forax, sera consacrée aux expressions Lambda sous toutes ses coutures. Rémi fera un état des lieux concernant cette nouvelle fonctionnalité qui viendra avec la nouvelle mouture du JDK. Il abordera notamment les sujets suivants :
– Les choix de design ainsi que les raisons,
– les stratégies d’implémentation et d’optimisation,
– les questions encore en suspens.

Nous avions vu dans un post précédent un aperçu de ces expressions lambda. Cette présentation vous permettra d’aller plus loin dans les détails d’implémentation.

L’agenda de cette soirée contient tous les ingrédients qui permettront de passer un moment aussi convivial qu’enrichissant. Si vous voulez réserver votre place et être sûr d’assister au Paris Jug de ce mois, soyez prêt Jeudi matin prochain à partir de 7h pour vous inscrire !! (attention les places partent rapidement)

#java #jsr337 #parisJug #jigsaw #lambda

Devoxx France – JDK8

Bientôt se tiendra la grande conférence Devoxx France.
L’évènement se tiendra sur 3 jours. Le premier jour (le 18 avril), aura lieu un ensemble de présentations de type "Université", c’est-à-dire des sessions de 3 heures permettant d’approfondir un sujet technique. Le programme de cette première journée est disponible sur le site de la conférence.
Parmi les sessions proposées, une a particulièrement retenu mon attention : JDK 8 demo: lambdas in Action. Comme son nom l’indique, on pourra y voir une démo d’une des nouveautés annoncées dans la prochaine version de Java : les expressions lambdas (JSR 335).

Qu'est ce qu'une Expression Lambda et qu'est ce que cela va apporter ?

une expression lambda ressemble à ça :

(parametre1, parametre2) -> {instruction1; instruction2; return resultat}

Une expression Lambda (ou closure) permet d’écrire de manière plus claire et accessible un bloc de code qui aujourd’hui serait écrit à l’aide d’une classe anonyme.
Par conséquent, cette nouvelle fonctionnalité a pour vocation de remplacer ces fameuses classes anonymes basées sur des interfaces à une seule méthode.
Les expressions Lambda seront utilisables avec des interfaces de type SAM (Single Abstract Method).
Ce bloc de code est affecté à un objet typé par une interface de type SAM comme par exemple Comparator<T> :

Comparator<int> monComparator = (int un, int deux) -> {_ligne de code permettant de comparer les deux paramètres; return resultat_}

Ensuite cette instance pourra être utilisée comme un objet classique.

Afin de renforcer le côté concis des expressions lambdas, des petites optimisations syntaxiques seront possibles. Par exemple, si le bloc de code ne contient qu’une seule expression alors on pourra se passer des accolades délimitant le bloc et du mot-clé return :

Comparator<String> monComparator = (String un, String deux) -> un.compareToIgnoreCase(deux);

Une autre possibilité est d’utiliser l’inférence de type (qui viendra avec la version 8 du JDK). Le compilateur sera capable d’évaluer le type des paramètres à partir de la définition du type générique de l’interface :

Comparator<String> monComparator = (un, deux) -> un.compareToIgnoreCase(deux);

Une autre fonctionnalité intéressante : les références de méthode. Jusqu’ici nous avons vu qu’il était possible de référencer un bloc de code. Il sera aussi possible de faire référence à une méthode particulière d’une classe ou d’une instance comme le montre l’exemple ci-dessous :

Comparator<String> monComparator = String#compareTo(String);

Ici on affecte le comportement de la méthode de comparaison à une instance du type de l’interface Comparator. Ensuite l’instance monComparator pourra être utilisée comme une instance classique.

Nous venons de voir un aperçu des expressions Lambda. La présentation qui sera faite à Devoxx France le 18 avril vous permettra d'approfondir ce sujet passionnant.

#java #jdk8 #devoxx #lambda #expression

Propulsé par WordPress.com.

Retour en haut ↑

Concevoir un site comme celui-ci avec WordPress.com
Commencer