Transcript

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/

• Agile Dynamic Language For The JVM• Inspired By Languages Such As...

–Python–Ruby–Smalltalk

2

What Is Groovy?

• 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

• Download Latest Release–http://groovy.codehaus.org/

• Extract Archive• Set $GROOVY_HOME• Add $GROOVY_HOME/bin to PATH

4

Installing Groovy

• groovy - Interpreter• groovyc - Compiler• groovysh - Shell• groovyConsole - Swing Console

5

Groovy Tools

$ 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

7

groovysh

8

groovyConsole

9

more on Groovy properties later...

Groovy Class

• Scripts Do Not Require A Class Definition–no main method

10

Groovy Scripts

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

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

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

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

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

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

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

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

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

Lets Go Meta...

// PrintIndependenceDay.groovy

def calendar = Calendar.instancecalendar.with { clear() set MONTH, JULY set DATE, 4 set YEAR, 1776 println time}

20

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

22

Everything Is An Object

• Single quoted Strings are java.lang.String• Double quoted Strings are "GStrings"

–may contain embedded Groovy code

23

Groovy Strings

• Strings May Be Referenced Using [ ]

24

Groovy Strings

• 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

26

Groovy List

27

Groovy Maps

• Groovy Beans / POGOs• Similar To POJOs

– ...but groovier–eliminates boilerplate code

28

Groovy Beans

29

POJO

30

POJO

• 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

• Groovy Beans Eliminate All Of The Boilerplate Code

• No Need To Write Getters/Setters• Seldom Need To Write Constructors

32

Groovy Beans

33

Groovy Beans

• Property Access Looks Like Field Access

34

Groovy Beans

35

Groovy Beans

• 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

• Groovy Adds A 'times' Method To Number• The 'times' Method Accepts A Closure As An

Argument

37

Closures

38

Closures

• Closures May Declare An Argument List

39

the times method is passing an argument into the closure

Closures

• The Implicit 'it' Argument

40

Closures

• Closures May Accept Multiple Arguments

41

Closures

• Closures Simplify Collection Iteration

42

Closures

43

Closures

44

Closures

• 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

46

MarkupBuilder

Q & A

47


Top Related