Filtrer les lignes d'un fichier en Groovy

Voici un exemple de ce que permet le langage Groovy, tiré d'un cas réel, dans lequel on souhaite récupérer une partie précise de certaines lignes provenant d'un fichier texte.
Ce fichier texte sert à coder des commandes d'impression qui seront interprétées par la suite pour effectuer une impression réelle.

Le but est de pouvoir récupérer le texte lisible qui se trouve sur chaque ligne commençant par le texte PrintLine, de manière à obtenir au final une sorte d'aperçu d'impression.

Voici un extrait du fichier d'impression (où NUL représente le caractère de code 0) :

Appliquée à un objet File, la méthode findAll de la GDK, prenant une Closure en argument, permet de parcourir les lignes d'un fichier tout en les filtrant.
Ainsi, dans le code ci-dessous, l'appel à findAll permet d'obtenir une collection de toutes les lignes commençant par PrintLine :

1
2
3
4
5
6
def lines = new File("filename").findAll { it.startsWith('PrintLine') }
                           .collect { it.drop(14).takeWhile { it != '\0' } }
                           .join('\n')

// Save
new File('save.txt').text = lines

Note: it est une variable implicite représentant l'élément courant.

Ensuite, en ligne 2, on construit une nouvelle collection à partir de chaque élément de la collection retournée par findAll, en prenant sur chaque ligne, du 15ème caractère jusqu'à rencontrer le caractère de code 0.

Enfin, à la ligne 3, avec l'utilisation de la méthode join('\n'), on obtient une chaîne de caractères constituée de tous les éléments de la dernière collection, séparés par un saut de ligne.
La valeur de la variable lines est alors enregistrée dans un fichier (ligne 6).

J'espère que cet exemple vous aura montré combien il est facile, avec Groovy, de coder de manière lisible et dans un style déclaratif.

Je vous invite également à consulter l'excellente présentation Functional Programming with Groovy.