Mysiga Groovy

När det kommer till programmeringsspråk, så är min favorit helt klart språket Groovy. Man skulle kunna uttrycka det som att Groovy är Java++. Precis som för 20-år sedan, då C-programmerare gradvis övergick till C++, så går Java-programmerare gradvis över till Groovy. Skälet är enkelt; man kan börja med en Java klass, byta namn på filändelsen från ‘.java’ till ‘.groovy’, kompilera med Groovy kompilatorn och sen stegvis göra koden mer “groovy”.

Ett Groovy program, exekverar i Java-motorn (JVM) på samma sätt som ett Java program och det är hur enkelt som helst att blanda och mixa Java med Groovy i samma applikation. Det finns flera JVM-språk att välja på nu för tiden förvisso (Groovy är äldst), men inget av alternativen smälter så lätt samman med Java kod.

Här är ett exempel som visar styrkan i Groovy och användandet av closures (lambda uttryck). Antag att vi av något outgrundligt skäl vill kvadrera alla tal mellan 1 och 100, samt summera ihop dessa. Så här kan man göra i Groovy:

Först skapar vi en Range för talen 1 till 100. En range uppträder som en lista, utan att representera talen explicit. Sen anropar vi funktionen collect, som löper i genom alla element och applicerar en closure, som kvaderar sitt argument. Resultatet från collect är nu en lista (med kvadrerade heltal). Slutligen anropar vi funktionen inject, som ackumulerar alla talen mha ytterligare en closure. Resultatet visas i GroovyConsole, som är en utmärkt testlåda för både Groovy och vanlig Java kod.

Här är ett annat exempel, där jag använder Spread operator (*.). Häng med!

Först ber vi system klassen om alla konfigurations variabler. Det som returneras är en Map, som kan liknas vid en uppslagstabell eller associativ array.

Sen applicerar vi funktionen getKey() på varje Map.Entry object, med hjälp av spread-operatorn och det faktum att en getter kan uttryckas som access av en egenskap (property). Resultatet blir nu en lista av nyckel-värden (det finns totalt 62 stycken).

Efter det filtrerar vi ut alla nycklar som börjar med ‘os’. Slutligen, sammanställer vi en lista med text strängar som innehåller “nyckel=värde” för de filtrerade system egenskaperna.

Fortfarande inte imponerad? OK, låt mig få sätta in det tunga artilleriet. Här ser du ett litet Groovy program, där jag delat upp det i några få funktioner för att öka läsbarheten. I korta drag läser programmet ned HTML sidan http://java.sun.com/j2se/1.5.0/download-pdf.html och extraherar ut alla (relativa) PDF länkar och presenterar dem som en HTML lista.

Själva huvudprogrammet ser du på raderna 12-15. Vi börjar med att ladda ned ett tredje-parts bibliotek från Maven Central Repository (rad 1), vilket sedan cache:as  till efterföljande gånger vi kör scriptet.

Funktionen fetch() använder biblioteket TagSoup för att tolka den HTML fil som laddas ned.

Funktionen extract() tar sedan en träd-representation av HTML koden och filtrerar ut alla A-taggar i BODY. För varje A-tag, så hämtas värdet för HREF-attributet ut, om det slutar med ‘.pdf’. Resultatet är nu en lista med relativa länkar såsom “../1.5/pdf/JPS_PDF.pdf“.

Funktionen normalize() använder Java:s egen URL klass för att skapa absoluta URL:er, dvs börjar med ‘http:…’. Slutligen, loopar vi över alla URL:er och printar ut var och en som ett HTML list-element (LI).

Är det häftigt, eller är det häftigt 🙂

Passa på att boka din Groovy kurs på Informators kurssida.