Groovy speech I held last year for introducing a new JVM language as substitute of Java. Easy and intuitive, it offers new features unknow to its parent yet.
1. Groovy Overview
It is Java as it should be. Easy and intuitive, it
offers new features unknown to its parent yet,
and come up with those benefits that form the
basis of the DSLs
Giancarlo Frison
2. Groovy is a super vision of Java. It can leverage Java’s enterprise
capabilities but also has closures and dynamic typing, without all
ceremonial syntax needed in Java
● Introduction
● Data types
● Language features
● Closures
● Meta programming
6. Frameworks
● Grails Web framework inspired by Ruby on Rails
● Gradle The next generation build system
● Griffon Desktop framework inspired by Grails
● Grape Add dependencies to your classpath
● Gorm Grails ORM persistance framework
● Gpars Concurrency/parallelism library
20. GStrings
● Multi-line strings ● Ranges
def tt = ''' assert fullname[0..5] == name
She sells, sea shells
By the sea shore''‘
● Comparison operators
a==b a +-* b
● String interpolation a<=>b a[]
def fullname = “$name $surname”
● Groovy-gdk
● Regexs http://groovy.codehaus.
assert'-36'==~ ‘/^[+-]?d+$/’ org/groovy-
jdk/java/lang/String.html
21. Collections
● Literal syntax ● Overloading operators
list = [3,new Date(),’Jan'] list << new Date()
assert list + list == list * 2
● Loop closures
map.each{key, value ->
println “$key : $value”
● Maps }
map = [a:1,b:2]
assert map['a']==1 && map.b ==2 ● …loop closures
each, every, collect, any,
inject, find, findAll,upto,
● Ranges downto, times, grep,
reverseEach, eachMatch,
def ls = ‘a'..'z‘,nums = 0..<10
eachWithIndex, eachLine
assert ls.size+nums.size == 36 eachFile, eachFileMatch…
22. Math operations
● No more :
BigDecimal.divide(BigDecimal right, <scale>,
BigDecimal.ROUND_HALF_UP)
● Instead
assert 1/2 == new java.math.BigDecimal("0.5")
25. Improved Switch
● It can handle any kind of value
switch (x) {
case 'James':
break
case 18..65:
break
case ~/Gw?+e/:
break
case Date:
break
case ['John', 'Ringo', 'Paul', 'George']:
break
default:
}
26. Groovy Truth
● Any expression could be used and evaluated whereas
Java requires a boolean.
● Number 0 return false
● Empty string, lists, maps, matchers return false
● Null objects return false
● Of course… boolean false return false
27. Null Object Pattern
● Null-safe version of Java's '.' operator
people << new Person(name:'Harry')
biggestSalary = people.collect{ p -> p.job?.salary }.max()
println biggestSalary
29. Multiple assignments
def (a, b, c) = [10, 20, 'foo']
assert a == 10 && b == 20 && c == 'foo‘
def geocode(String location) {
// implementation returns [48.824068, 2.531733]
}
def (lat, long) = geocode(“Bassano del Grappa, Italia")
30. GPath
● expression language integrated into Groovy which allows
parts of nested structured data to be identified.
● a.b.c -> for XML, yields all the <c> elements inside <b> inside
<a>
def feed = new XmlSlurper().parse('http://gfrison.com/rss')
println feed.channel.item[0].title
● a.b.c -> all POJOs, yields the <c> properties for all the <b>
properties of <a> (sort of like a.getB().getC() in JavaBeans)
32. Closures
● Treats data structures and operations as Objects
def clos = { println "hello!" }
clos()
● Closures as method arguments
def houston = {doit ->
(10..1).each{ count->
doit(count)
}
}
houston{ println it }
33. Closure delegate
● Groovy has 3 variables inside each closure for defining
different classes in his scope:
● this: As in Java it refers to the closure itself.
● owner: Enclosing object of the closure.
● delegate: The same of the owner, but it can be replaced
● When a closure encounters a method call that it cannot
handle itself, it automatically relays the invocation to its
owner object. If this fails, it relays the invocation to its
delegate.
38. ExpandoMetaClass
● Allow to dynamically add methods, properties…
String.metaClass.swapCase = {->
def sb = new StringBuffer()
delegate.each {
sb << (Character.isUpperCase(it as char) ?
Character.toLowerCase(it as char) :
Character.toUpperCase(it as char))
}
sb.toString()
}
println "hELLO wORLD".swapCase()
39. Expando
● It is a container for everything added by developer
def bean = new Expando( name:"James", location:"London", id:123 )
assert "James" == bean.name
assert 123 == bean.id
40. Categories
● Add functionalities to classes to make them more usable
class StringCategory {
static String lower(String string) {
return string.toLowerCase()
}
}
use (StringCategory) {
assert "test" == "TeSt".lower()
}
use (groovy.time.TimeCategory ) {
println 1.minute.from.now
println 10.hours.ago
println new Date() - 3.months
}
41. AST Examples
● Grape
@Grab('org.mortbay.jetty:jetty-embedded:6.1.0')
def server = new Server(8080)
println "Starting Jetty, press Ctrl+C to stop."
server.start()
● Slf4j
@Slf4j
class HelloWorld {
def logHello() {
log.info 'Hello World'
}
}
42. AST Transformations
● compile-time metaprogramming capabilities allowing
powerful flexibility at the language level, without a
runtime performance penalty.
● Global transformations adding a jar
● Local transformations by annotating code elements:
@Immutable @Delegate @Log @Field @PackageScope @AutoClone
@AutoExternalizable @ThreadInterrupt @TimedInterrupt
@ConditionalInterrupt @ToString @EqualsAndHashCode
@TupleConstructor @Canonical @InheritConstructors @WithReadLock
@WithWriteLock @ListenerList @Singleton @Lazy @Newify @Category
@Mixin @PackageScope @Grab @Bindable @Vetoable