productive programming in groovy

21
Productive (Web) Programming with Groovy S G Ganesh Independent Consultant, Trainer, and Author [email protected]

Upload: ganesh-samarthyam

Post on 08-Jan-2017

292 views

Category:

Software


0 download

TRANSCRIPT

Productive (Web) Programming with Groovy

S G GaneshIndependent Consultant, Trainer, and Author

[email protected]

Introducing Groovy

Groovy enters the top 20 of TIOBE index!

1.7 million downloads in

2012!

How I felt Programming in Groovy vs. Java

“Hello World” Example

class Hello {! public static void main(String []args) {! ! System.out.println("hello world");! }}

class Hello {! public static void main(String []args) {! ! System.out.println("hello world");! }}

First (simple) Exampleimport java.io.*;

class Type { public static void main(String []files) { // process each file passed as argument for(String file : files) { // try opening the file with FileReader try (FileReader inputFile = new FileReader(file)) { int ch = 0; while( (ch = inputFile.read()) != -1) { // ch is of type int - convert it back to char System.out.print( (char)ch ); } } catch (FileNotFoundException fnfe) { System.err.printf("Cannot open the given file %s ", file); } catch(IOException ioe) { System.err.printf("Error when processing file %s; skipping it", file); } // try-with-resources will automatically release FileReader object } }}

args.each { println new File(it).getText() }

Mere “Syntactic Sugar?” Map<String, String> inglishWords = new HashMap<>(); inglishWords.put("Shampoo", "'Chapmo' (Hindi)"); inglishWords.put("Sugar", "'Sarkkarai' (Tamil)"); inglishWords.put("Copra", "'Koppara' (Malayalam)"); inglishWords.put("Jute", "'Jhuto' (Bengali)"); inglishWords.put("Cot", "'Khatva' (Sanskrit)"); for(Map.Entry<String, String> word : inglishWords.entrySet()) { System.out.printf("%s => %s \n", word.getKey(), word.getValue()); }

def inglishWords = [ "Shampoo" : "'Chapmo' (Hindi)", "Sugar" : "'Sarkkarai' (Tamil)", "Copra" : "'Koppara' (Malayalam)", "Jute" : "'Jhuto' (Bengali)", "Cot" : "'Khatva' (Sanskrit)" ] inglishWords.each { key, value -> println "$key => $value" }

Just “Concise” Expression?

System.out.println("The (key-based) sorted map is: "); Map<String, String> keySortedMap = new TreeMap<>(inglishWords); for(Map.Entry<String, String> word : keySortedMap.entrySet()) { System.out.printf("%s => %s \n", word.getKey(), word.getValue()); }

println "The (key-based) sorted map is: " def keySortedMap = inglishWords.sort()

keySortedMap.each { key, value -> println "$key => $value" }

11

Now for the real magic with Groovy :-)

class MapUtil { // this code segment from http://stackoverflow.com/questions/109383/how-to-sort-a-mapkey-value-on-the-values-in-java public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue( Map<K, V> map ) { List<Map.Entry<K, V>> list = new LinkedList<Map.Entry<K, V>>( map.entrySet() ); Collections.sort( list, new Comparator<Map.Entry<K, V>>() { public int compare( Map.Entry<K, V> o1, Map.Entry<K, V> o2 ) { return (o1.getValue()).compareTo( o2.getValue() ); } } );

Map<K, V> result = new LinkedHashMap<K, V>(); for (Map.Entry<K, V> entry : list) { result.put( entry.getKey(), entry.getValue() ); } return result; }}

System.out.println("The (value-based) sorted map is: "); Map<String, String> valueSortedMap = MapUtil.sortByValue(inglishWords); for(Map.Entry<String, String> word : valueSortedMap.entrySet()) { System.out.printf("%s => %s \n", word.getKey(), word.getValue()); }

println "The (value-based) sorted map is: " def valueSortedMap = inglishWords.sort

{ it.value }

valueSortedMap.each { key, value -> println "$key => $value" }

HTML Creation Example

try (PrintWriter pw = new PrintWriter(new FileWriter("./index.java.html"))) { pw.println("<html> <head> <title>Words from Indian origin in English</title> </head>

<body>"); pw.println("<h1>Words from Indian origin in English</h1>"); pw.println("<table border='1'> <tr> <th>Inglish word</th> <th>Origin</th></tr>"); for(Map.Entry<String, String> word : inglishWords.entrySet()) { pw.printf("<tr> <td> %s </td> <td> %s </td> </tr>", word.getKey(),

word.getValue()); } pw.println("</table> <p style='font-style:italic;font-size:small;float:right'>Results obtained at "

+ new Date() + "</p> </body> </html>"); }

HTML Creation Example

def writer = new StringWriter()def doc = new MarkupBuilder(writer)doc.html() { head { title("Words from Indian origin in English") } body { h1("Words from Indian origin in English") table(border:1) { tr { th("Inglish word") th("Origin") } inglishWords.each { word, root -> tr { td("$word") td("$root") } } } p(style:'font-style:italic;font-size:small;float:right', "Results obtained at ${new

Date().dateTimeString}") }}

Not Convinced? Check XML Creation Example

try (PrintWriter pw = new PrintWriter(new FileWriter("./words.xml"))) { pw.println("<inglishwords>"); for(Map.Entry<String, String> word : inglishWords.entrySet()) { pw.printf("\t<language word='%s'> \n \t\t <origin> '%s'</origin> \n \t </language> \n", word.getKey(), word.getValue()); } pw.println("</inglishwords>"); }

xmlbuilder = new groovy.xml.MarkupBuilder()

xmlbuilder.inglishwords { words.each { key, value -> language(word:key) { origin(value) } }}

Where to Learn More About Groovy?