Lab Exercise 0: Install Groovy Exercise 1: Groovy is Java 5610_groovy_basics.zip
def dynamic = 1
println dynamic // 1
println dynamic.class // java.lang.Integer
dynamic = "I am a String stored in a variable of dynamic type"
println dynamic // I am a String stored in a variable of dynamic type
println dynamic.class // java.lang.String
int typed = 2
println typed
//typed = "I am a String stored in a variable of type int??" // throws ClassCastException
class Calculator {
// Use “def” to replace return type
def add (x, y) {
x+y // No return statement required in Groovy
}
def subtract (x, y) {
x-y
}
}
result1 = new Calculator().add(13,4)
result2 = new Calculator().subtract(13,4)
result3 = new Calculator().add("sang", "shin")
result4 = new Calculator().subtract("sangshin", "sang")
println result1 // 17
println result2 // 9
println result3 // sangshin
println result4 // shin
def add (x, y) {
x+y
}
def subtract (x, y) {
x-y
}
result1 = add(13,4)
result2 = subtract(13,4)
result3 = add("sang", "shin")
result4 = subtract("sangshin", "sang")
println result1 // 17
println result2 // 9
println result3 // sangshin
println result4 // shin
// Each list expression creates an implementation of java.util.List
def list = [5, 6, 7, 8]
println list.get(2) // 7
println list[2] // 7
println list instanceof java.util.List // true
// Create an empty list
def emptyList = []
println emptyList.size() // 0
emptyList.add(5)
println emptyList.size() // 1
emptyList<<6
println emptyList.size() // 2
Range can be used as Lists since Range extends java.util.List.
// an inclusive range
def range = 5..8
assert range.size() == 4
assert range.get(2) == 7
assert range[2] == 7
assert range instanceof java.util.List
assert range.contains(5)
assert range.contains(8)
// lets use a half-open range
range = 5..<8
assert range.size() == 3
assert range.get(2) == 7
assert range[2] == 7
assert range instanceof java.util.List
assert range.contains(5)
assert ! range.contains(8)
// get the end points of the range without using indexes
range = 1..10
assert range.from == 1
assert range.to == 10
Map keys are strings by default:
[a:1] is equivalent to ["a":1]
def map = [name:"Gromit", likes:"cheese", id:1234]
assert map.get("name") == "Gromit"
assert map.get("id") == 1234
assert map["name"] == "Gromit"
assert map['id'] == 1234
assert map instanceof java.util.Map
def emptyMap = [:]
assert emptyMap.size() == 0
emptyMap.put("foo", 5)
assert emptyMap.size() == 1
assert emptyMap.get("foo") == 5
// Double quotes – String interpolation is supported (GString)
def name = "Sang Shin"
def name1 = "Hello, ${name}" // => Hello, Sang Shin
println name1 + ", " + name1.class.name
// Single quotes – String interpolation is not supported (No GString)
def name2 = 'Hello, ${name}' // => Hello, ${name}
println name2 + ", " + name2.class.name
// Slashes – String interpolation is supported (GString)
def name3 = /Hello, ${name}/ // => Hello, Sang Shin
println name3 + ", " + name3.class.name
// Compile error if you do not use backslash for escaping backslash
//def windowPathWithQuotes1 = 'C:\Windows\System32'
def windowPathWithQuotes2 = 'C:\\Windows\\System32' // single quote '
println windowPathWithQuotes2
def windowPathWithQuotes3 = "C:\\Windows\\System32" // double quote “
println windowPathWithQuotes3
// No need to use an extra backslash
def windowPathWithSlashes = /C:\Windows\System32/
println windowPathWithSlashes
foxtype = 'quick'
foxcolor = ['b', 'r', 'o', 'w', 'n']
result = "The $foxtype ${foxcolor.join()} fox"
println result // => The quick brown fox
println result.class.name // => org.codehaus.groovy.runtime.GStringImpl
// This is a compile error
// def foo = "hello
// Define a multi-line string
def name = "Sang Shin"
def text = """\
Hello there ${name}
How are you today?
"""
println(text)
Lab Exercise 2: Groovy Syntax I 5610_groovy_basics.zip
println "something" ==~ /something/ // => true
println "something" ==~ /.*g$/ // => true (ending char is g)
println "something" ==~ '.*g$' // => true (ending char is g)
println "something" ==~ '.*s$' // => false (ending char is not s)
println "something" ==~ '^s.*$' // => true (starting char is s)
println "something" ==~ /\D*/ //=> true (non digital characters)
println "something" ==~ '\\D*' // => true (non digital characters)
//println "something" ==~ '\D*' // compile error
// Create a Matcher
def myMatcher = "cheesecheesecheese" =~ /chee/
println myMatcher instanceof java.util.regex.Matcher // => true
// Call some methods of Matcher object
println myMatcher.size() // => 3
println myMatcher[0] // => chee
// Do some replacement
println myMatcher.replaceFirst("nice") // => nicesecheesecheese
println myMatcher.replaceAll("good") // => goodsegoodsegoodse
// ~String creates a Pattern from String
def pattern = ~/foo/
// Perform a matching through the Pattern object
println pattern instanceof java.util.regex.Pattern // => true
println pattern.matcher("foo").matches() // => true
println pattern.matcher("foobar").matches() // => false
// ~String creates a Pattern from String
def pattern2 = ~/f.*/
// Perform a matching through the Pattern object
println pattern2 instanceof java.util.regex.Pattern // => true
println pattern2.matcher("foo").matches() // => true
println pattern2.matcher("foobar").matches() // => true
println 7 + 4 // => 11
println 7.plus(4) // => 11
println 7 * 4 // => 28
println 7.multiply(4) // => 28
println 'Sang' + 'Shin' // SangShin
println 'Sang'.plus('Shin') // SangShin
class Language {
String lang
def speak() { "$lang speaks." }
}
// Create a list with 3 objects. Each object has a lang property and a speak() method.
def list = [
new Language(lang: 'Groovy'),
new Language(lang: 'Java'),
new Language(lang: 'Scala')
]
// Use the spread operator to invoke the speak() method.
assert list*.speak() == ['Groovy speaks.', 'Java speaks.', 'Scala speaks.']
assert list.collect{ it.speak() } == ['Groovy speaks.', 'Java speaks.', 'Scala speaks.']
// We can also use the spread operator to access properties, but we don't need to,
// because Groovy allows direct property access on list members.
assert list*.lang == ['Groovy', 'Java', 'Scala']
assert list.lang == ['Groovy', 'Java', 'Scala']
def testText1 = null
// Normal ternary operator.
def ternaryResult = (testText1 != null) ? testText1 : 'Hello Groovy1!'
println ternaryResult // => Hello Groovy1
def testText2 = null
// The Elvis operator
def elvisResult2 = testText2 ?: 'Hello Groovy2!'
println elvisResult2 // => Hello Groovy2!
def testText3 = 'Sang Shin'
// The Elvis operator
def elvisResult3 = testText3 ?: 'Hello Groovy3!'
println elvisResult3 // => Sang Shin
class Person {
String name
int age
}
Person person // person is null
// Java way of checking null vaiue
if (person != null){
println "Name of the person is ${person.name}"
}
// Groovy way using Safe navigation operator
println "Name of the person is ${person?.name}"
Lab Exercise 3: Groovy Syntax II 5610_groovy_basics.zip
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class Blog {
private String name;
private String message;
public Blog() {}
public Blog(String name, String Message) {
this.name = name;
this.message = Message;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMessage() {
return message;
}
public void setMessage(String Message) {
this.message = Message;
}
public static void main(String[] args) {
List Blogs = new ArrayList();
Blogs.add(new Blog("1", "one"));
Blogs.add(new Blog("2", "two"));
Blogs.add(new Blog("3","three"));
for(Iterator iter = Blogs.iterator();iter.hasNext();) {
Blog Blog = (Blog)iter.next();
System.out.println(Blog.getName() + " " + Blog.getMessage());
}
}
}
Lab Exercise 4: Refactor Java Code to Groovy Code 5610_groovy_basics.zip
// This is JavaBean written in Java
public class Blog {
private String name;
private String message;
public Blog() {}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
// Groovy code that uses JavaBean
// In Groovy, every object has “metaClass” property
Blog.metaClass.sayHello = {
println "Hello"
}
def myBlog = new Blog(name:"4", message:"four")
myBlog.sayHello()
Lab Exercise 5: Java and Groovy Code Interoperability 5610_groovy_basics.zip
Download PDF and Lab Zip files