groovyCommencer avec groovy


Remarques

Groovy est

  • est un langage dynamique éventuellement typé pour la machine virtuelle Java

  • s'appuie sur les atouts de Java mais possède des fonctionnalités supplémentaires inspirées de langages tels que Python, Ruby et Smalltalk

  • met à la disposition des développeurs Java des fonctionnalités de programmation modernes avec une courbe d'apprentissage presque nulle

  • offre la possibilité de taper de manière statique et de compiler statiquement votre code pour la robustesse et la performance

  • prend en charge les langages spécifiques à un domaine et toute autre syntaxe compacte pour que votre code soit facile à lire et à gérer

  • Facilite l'écriture de scripts de shell et de build avec ses puissantes primitives de traitement, ses capacités OO et son DSL Ant

  • Augmente la productivité des développeurs en réduisant le code d'échafaudage lors du développement d'applications Web, d'interface graphique, de base de données ou de console

  • simplifie les tests en prenant en charge les tests unitaires et les moqueries

  • s'intègre parfaitement à toutes les classes et bibliothèques Java existantes

  • compile directement en Java bytecode pour que vous puissiez l'utiliser partout où vous utilisez Java

Versions

Bonjour le monde

La version Groovy de Hello World.

println 'Hello World!'
 

Bonjour tout le monde dans groovy

L'exemple suivant illustre le plus simple Hello World dans groovy using script, placez l'extrait de code suivant dans un fichier, par exemple helloWorld.groovy

println 'Hello World!'
 

Comment exécuter: Dans la ligne de commande, groovy helloWorld.groovy

Sortie: Hello World!

Bonjour le monde Shebang (linux)

Étant donné un fichier hello.groovy avec un contenu:

#!/usr/bin/env groovy
println "Hello world"
 

Peut être exécuté à partir de la ligne de commande si l'autorisation d'exécution est donnée

$ ./hello.groovy
 

Installation ou configuration

Il existe deux méthodes courantes pour installer Groovy.

Télécharger

Le binaire Groovy peut être téléchargé sur la page de téléchargement du site Groovy. Vous pouvez décompresser l'archive et ajouter le chemin d'accès à %GROOVY_HOME%/bin/groovy.bat à la variable d'environnement système PATH, où% GROOVY_HOME% est le répertoire dans lequel Groovy est décompacté.

SDKMAN

L'autre option consiste à utiliser SDKMAN . Cette option a rapidement gagné en popularité et rend la gestion de plusieurs versions de Groovy très simple. Il supporte également d'autres applications dans l'écosphère "GR8". Cette option fonctionne très bien sur Linux et Mac, mais nécessite Cygwin sous Windows.

En suivant les instructions de la page de téléchargement Groovy , vous pouvez procéder comme suit pour installer SDKMAN.

$ curl -s get.sdkman.io | bash

Une fois SDKMAN installé, vous avez maintenant accès à la commande sdk . Avec cette commande, vous pouvez faire beaucoup de choses utiles.

Installer Groovy

$ sdk install groovy

Cela va installer la dernière version de Groovy.

Liste des versions de Groovy

$ sdk ls groovy

Cela vous permet d'exécuter une commande Linux style ls sur le logiciel Groovy, répertoriant toutes les options disponibles. Il y a un * côté de chaque version installée et un > pour indiquer vos versions actuelles.

Changer de version de Groovy

$ sdk use groovy 2.4.7

Cela changera la version actuelle de Groovy à 2.4.7. Si vous avez d'autres versions installées, vous pouvez passer à l'une d'entre elles.

Vous pouvez lister la version actuelle de groovy avec la commande groovy -version .

posh-gvm

Le nom initial de SDKMAN était GVM et posh-gvm est un port de GVM pour Windows Powershell. Donc, si vous développez sur une machine Windows et ne voulez pas utiliser SDKMAN sur Cygwin, posh-gvm est fait pour vous. Il fonctionne de la même façon que SDKMAN, mais au lieu de sdk , la commande est gmv . Alors

PS C:\Users\You> gmv install groovy
 

va installer groovy à travers posh-gvm sur votre machine Windows.

Utiliser Groovy sur un projet Java

Groovy a accès à toutes les classes java, en fait les classes Groovy sont des classes Java et peuvent être exécutées directement par JVM. Si vous travaillez sur un projet Java, utiliser Groovy comme langage de script simple pour interagir avec votre code Java est une évidence.

Pour rendre les choses encore meilleures, presque toutes les classes Java peuvent être renommées en .groovy et compilées et exécutées et fonctionneront exactement comme avant.

Groovy a un REPL. groovysh est livré avec Groovy et peut être utilisé pour instancier et tester rapidement une classe Java si votre classpath est configuré correctement. Par exemple, si votre classpath de classe pointe vers votre répertoire eclipse "classes / bin", vous pouvez alors enregistrer votre fichier dans eclipse, sauter à groovysh et instancier la classe pour le tester.

Les raisons d'utiliser Groovy pour faire cela au lieu de simplement Java sont les suivantes: Le chargeur de classes est excellent pour ramasser les nouvelles classes à mesure qu'elles sont compilées. Vous n'avez généralement pas besoin de quitter / redémarrer groovysh fur et à mesure de votre développement.

La syntaxe est TERSE. Ce n'est pas idéal pour le code maintenable, mais pour les scripts et les tests, il peut réduire considérablement votre code. L'une des grandes choses qu'il fait est d'éliminer les exceptions vérifiées (ou, plus précisément, de transformer toutes les exceptions vérifiées en exceptions non vérifiées). Cela transforme le code comme ceci (Imprimer bonjour après une seconde):

class JavaClass {
    public static void main(String[] args) {
        try {
            Thread.sleep(1000);
        } catch(InterruptedException e) {
            // You shouldn't leave an empty catch block, but who cares if this was interrupted???
        }
        System.out.println("Hello!");
    }
}
 

dans Groovy's:

Thread.sleep(1000)
print "Hello!"
 

Groovy a également une syntaxe d'initialisation très serrée. Cela vous permet de spécifier des données comme vous l’aimez sans y penser:

En Java pour initialiser une carte, vous devriez probablement faire quelque chose comme ceci:

String[] init = { "1:Bill", "2:Doug", "3:Bev" };
// Note the rest of this can be put in a function and reused or maybe found in a library, but I always seem to have to write this function!
Map m = new HashMap<Integer, String>();
for(String pair : int) {
    String[] split = pair.split(":");
    m.put(new Integer(split[0]), split[1])
}
 

Ce n'est pas mal, mais c'est autre chose à maintenir. En groovy vous utiliseriez simplement:

Map map = { 1 : "Bill", 2 : "Doug", 3 : "Bev" }
 

Et vous avez terminé. La syntaxe des listes est tout aussi simple.

L'autre grand avantage est la syntaxe de fermeture de groovy. C'est incroyablement laconique et amusant, un peu plus difficile à maintenir, mais pour les scripts qui ne sont pas une priorité. Par exemple, voici un code groovy pour trouver tous les fichiers .txt contenant le mot Hello dans le répertoire courant:

println new File('.').files.findAll{ it.name.endsWith('.txt') && it.text.contains('Hello') }.collect{ it.name }
 

Cet exemple utilise quelques astuces "Groovy":

  • .files fait référence à la méthode getFiles() - groovy peut basculer entre getter / setter et la syntaxe des propriétés à volonté

  • it. fait référence à l'élément actuel d'une itération. { it } est un raccourci pour { it -> it } , par exemple:

    [1, 2, 3] .collect {it ^ 2} == [1, 4, 9]

  • it.text (où it s'agit d'un fichier) utilise une méthode groovy ajoute à File pour récupérer l'intégralité du texte du fichier. Ceci est incroyablement utile dans les scripts.

Utilisation de inject () On List pour créer une chaîne CSV

Dans Groovy, la méthode inject () est l'une des méthodes cumulatives qui nous permet d'ajouter (ou d'injecter) de nouvelles fonctionnalités dans tout objet qui implémente la méthode inject (). Dans le cas d'une collection, nous pouvons appliquer une fermeture à une collection d'objets de manière uniforme, puis assembler les résultats en une seule valeur. Le premier paramètre de la méthode inject () est la valeur initiale du cumul et le second paramètre est la fermeture.

Dans cet exemple, nous allons prendre une liste de chaînes en tant que paramètre et afficher les valeurs de ces chaînes délimitées par des virgules. J'ai utilisé cette fonctionnalité pour ajouter une liste de valeurs à une chaîne de requête REST et, si vous la modifiez un peu, je l'ai utilisée pour inclure des valeurs dans une instruction SQL dans le cadre d'une clause IN. Voici le code pour faire ceci:

public String convertToCSV( List<String> list ) {
    if (list == null) {
        return ""
    }
    return list.inject( '' ) { result, item ->
        result + ( result && item ? ',' : '' ) + ( item ? "${item.trim()}" : '' )
    }
}

assert convertToCSV( null ) == ""
assert convertToCSV( ["aaa", "bbb  ", null, "  ccc  "] ) == "aaa,bbb,ccc" 
 

Dans cet exemple, le premier paramètre de la méthode inject () est une chaîne de longueur zéro, ce qui signifie que lors du traitement du premier élément de la liste, le résultat est également une chaîne de longueur nulle. Cela se résume en faux dans la première évaluation ternaire, ce qui explique pourquoi nous n’obtenons pas de virgule au début de la chaîne. Avec chaque itération consécutive des éléments de la liste, le résultat devient la concaténation de lui-même, une virgule, puis l'élément suivant jusqu'à ce que nous atteignions le dernier élément de la liste.

L'avantage de cette approche est que vous n'avez pas besoin d'une variable en dehors d'une construction en boucle pour contenir le résultat de chaîne concaténé. L'implication étant que cela peut entraîner des effets secondaires dans votre code. Avec l’approche inject (), ce comportement est injecté et la collection associe le résultat des appels à la fermeture pour vous. L'inconvénient de cette approche peut être la lisibilité. Mais avec de l'expérience, cela devient plus facile à lire et à comprendre, et j'espère que cet exemple vous aidera à atteindre cet objectif.