Page 1
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Groovy For Java Programmers
QCONSF 2010
Jeff BrownCore Grails Developer
[email protected] - A Division Of VMware
http://springsource.com/
Page 2
• Agile Dynamic Language For The JVM• Inspired By Languages Such As...
–Python–Ruby–Smalltalk
2
What Is Groovy?
Page 3
• Powerful Dynamic Language• Relatively Easy To Learn• Familiar Syntax For Java Programmers• Integrates Really Well With Java
–Containers, Libraries, Existing Java Code
3
Why Groovy
Page 4
• Download Latest Release–http://groovy.codehaus.org/
• Extract Archive• Set $GROOVY_HOME• Add $GROOVY_HOME/bin to PATH
4
Installing Groovy
Page 5
• groovy - Interpreter• groovyc - Compiler• groovysh - Shell• groovyConsole - Swing Console
5
Groovy Tools
Page 6
$ groovy -versionGroovy Version: 1.5.4 JVM: 1.5.0_13-119
$ groovy -e "println 'Groovy Rocks.'"Groovy Rocks.
$ groovy -e "x=5; y=10; z=x*y; println z"50
6
Give It A Spin
Page 9
9
more on Groovy properties later...
Groovy Class
Page 10
• Scripts Do Not Require A Class Definition–no main method
10
Groovy Scripts
Page 11
Print Independence Day
// PrintIndependenceDay.java
import java.util.Calendar;import java.util.Date;
public class PrintIndependenceDay { public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.set(Calendar.MONTH, Calendar.JULY); calendar.set(Calendar.DATE, 4); calendar.set(Calendar.YEAR, 1776); Date time = calendar.getTime(); System.out.println(time); }}
11
Page 12
Print Independence Day
// PrintIndependenceDay.groovy
import java.util.Calendar;import java.util.Date;
public class PrintIndependenceDay { public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.set(Calendar.MONTH, Calendar.JULY); calendar.set(Calendar.DATE, 4); calendar.set(Calendar.YEAR, 1776); Date time = calendar.getTime(); System.out.println(time); }}
12
Page 13
No Utility Imports...
// PrintIndependenceDay.groovy
public class PrintIndependenceDay { public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.set(Calendar.MONTH, Calendar.JULY); calendar.set(Calendar.DATE, 4); calendar.set(Calendar.YEAR, 1776); Date time = calendar.getTime(); System.out.println(time); }}
13
Page 14
No Semicolons...
// PrintIndependenceDay.groovy
public class PrintIndependenceDay { public static void main(String[] args) { Calendar calendar = Calendar.getInstance() calendar.clear() calendar.set(Calendar.MONTH, Calendar.JULY) calendar.set(Calendar.DATE, 4) calendar.set(Calendar.YEAR, 1776) Date time = calendar.getTime() System.out.println(time) }}
14
Page 15
No Getters...
// PrintIndependenceDay.groovy
public class PrintIndependenceDay { public static void main(String[] args) { Calendar calendar = Calendar.instance calendar.clear() calendar.set(Calendar.MONTH, Calendar.JULY) calendar.set(Calendar.DATE, 4) calendar.set(Calendar.YEAR, 1776) Date time = calendar.time System.out.println(time) }}
15
Page 16
No Static Typing...
// PrintIndependenceDay.groovy
public class PrintIndependenceDay { public static void main(String[] args) { def calendar = Calendar.instance calendar.clear() calendar.set(Calendar.MONTH, Calendar.JULY) calendar.set(Calendar.DATE, 4) calendar.set(Calendar.YEAR, 1776) def time = calendar.time System.out.println(time) }}
16
Page 17
No System.out.blah.blah...
// PrintIndependenceDay.groovy
public class PrintIndependenceDay { public static void main(String[] args) { def calendar = Calendar.instance calendar.clear() calendar.set(Calendar.MONTH, Calendar.JULY) calendar.set(Calendar.DATE, 4) calendar.set(Calendar.YEAR, 1776) def time = calendar.time println(time) }}
17
Page 18
No Class...
// PrintIndependenceDay.groovy
def calendar = Calendar.instancecalendar.clear()calendar.set(Calendar.MONTH, Calendar.JULY)calendar.set(Calendar.DATE, 4)calendar.set(Calendar.YEAR, 1776)
def time = calendar.time
println(time)
18
Page 19
Optional Parens...
// PrintIndependenceDay.groovy
def calendar = Calendar.instancecalendar.clear()calendar.set Calendar.MONTH, Calendar.JULYcalendar.set Calendar.DATE, 4calendar.set Calendar.YEAR, 1776
def time = calendar.time
println time
19
Page 20
Lets Go Meta...
// PrintIndependenceDay.groovy
def calendar = Calendar.instancecalendar.with { clear() set MONTH, JULY set DATE, 4 set YEAR, 1776 println time}
20
Page 21
Lets Compare...
// PrintIndependenceDay.groovy
def calendar = Calendar.instancecalendar.with { clear() set MONTH, JULY set DATE, 4 set YEAR, 1776 println time}
// PrintIndependenceDay.java
import java.util.Calendar;import java.util.Date;
public class PrintIndependenceDay { public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.set(Calendar.MONTH, Calendar.JULY); calendar.set(Calendar.DATE, 4); calendar.set(Calendar.YEAR, 1776); Date time = calendar.getTime(); System.out.println(time); }}
21
Page 22
22
Everything Is An Object
Page 23
• Single quoted Strings are java.lang.String• Double quoted Strings are "GStrings"
–may contain embedded Groovy code
23
Groovy Strings
Page 24
• Strings May Be Referenced Using [ ]
24
Groovy Strings
Page 25
• Groovy Collections Are Standard java.util.Collections
• Groovy Adds Many Useful Methods To Existing Collections
• Many Common Tasks Are Much More Simple In Groovy Compared To Java
25
Groovy Collections
Page 28
• Groovy Beans / POGOs• Similar To POJOs
– ...but groovier–eliminates boilerplate code
28
Groovy Beans
Page 31
• Modern Java IDEs Generate Most Of That Code–developer declares fields– IDE generates constructors– IDE generates getters/setters
31
If the IDE can generate all of that code, why can't the compiler or the
POJO
Page 32
• Groovy Beans Eliminate All Of The Boilerplate Code
• No Need To Write Getters/Setters• Seldom Need To Write Constructors
32
Groovy Beans
Page 34
• Property Access Looks Like Field Access
34
Groovy Beans
Page 36
• A Block Of Code• May Be Passed As Arguments• May Accept Parameters• May Return A Value• Much More Powerful Than Anonymous Inner
Classes
36
Closures
Page 37
• Groovy Adds A 'times' Method To Number• The 'times' Method Accepts A Closure As An
Argument
37
Closures
Page 39
• Closures May Declare An Argument List
39
the times method is passing an argument into the closure
Closures
Page 40
• The Implicit 'it' Argument
40
Closures
Page 41
• Closures May Accept Multiple Arguments
41
Closures
Page 42
• Closures Simplify Collection Iteration
42
Closures
Page 45
• Builders Are A Powerful Concept• Metaprogramming Makes Builders A Snap In
Groovy• Several Builders Are Bundled With Groovy
–SwingBuilder, MarkupBuilder, etc...
• You Can Write Your Own
45
Builders