Peut-on faire des requêtes de type SQL en utilisant les streams de Java 8 ? En utilisant des fonctions comme MIN ou MAX ? Si on manipule par exemple des instances de la classe Footballeur ci-dessous, comment fait-on pour trouver le joueur ayant marqué le plus de buts ?

class Footballeur {
  String nom;
  Integer nbButs;
}

En SQL, c’est facile, on ferait une sous requête :

SELECT * FROM footballeur
WHERE nbButs = (SELECT MAX(nbButs) FROM footballeur);

En Java, on trouve beaucoup d’exemples permettant de récupérer le plus grand élément d’une liste, mais moins pour récupérer les propriétés de l’objet associé. J’ai eu ce genre de problématique cette semaine, et après un long quart d’heure de recherches infructueuses, j’ai fini par me lancer dans le deep web des développeurs, c’est à dire la page 2 de Google. J’ai trouvé ma réponse sur ce site plein d’exemples intéressants : Java 8 – Collection enhancements leveraging Lambda Expressions – or: How Java emulates SQL

La solution est de passer à la fonction max() une lambda implémentant l’interface Comparator. Dans notre cas, ça donne donc :

Footballeur meilleurButeur = getFootballeurs().stream().
    		max((f1, f2) -> f1.nbButs - f2.nbButs).get();

Tout simplement !

Le code source de l’exemple et son test unitaire sont disponibles sur GitHub.