This section covers simple data types in the Groovy language, collections are a complex complex data types and is covered in the next section.
Groovy supports only Wrapper objects which are listed below, although you could for an example use a byte in the code it autoboxes it to a Byte, some of the data types I will cover in more depth in later sections.
| Data Type | Wrapper | Min/Max | Description |
|---|---|---|---|
| byte | Byte | -128 to 127 | represent a byte value |
| short | Short | -32,768 to 32,767 | represent a short number |
| int | Integer | -2,147,483,648 to 2,147,483,647 | represent a int value |
| long | Long | -9,223,372,036,854,775,808 to +9,223,372,036,854,775,807 | represent a long value |
| float | Float | 1.40129846432481707e-45 to 3.40282346638528860e+38 | represent a float value |
| double | Double | 4.94065645841246544e-324d to 1.79769313486231570e+308d | represent a int value |
| n/a | BigInteger | n/a | represent a BigInteger value |
| n/a | BigDecimal | n/a | represent a BigDecimal value |
| char | Character | 0 to 65535 | represent a char value |
| n/a | Boolean | True or False | represent a Boolean value |
| n/a | String | n/a | represent a int value |
Here are some examples
| Data type examples | byte b = 10 // Byte println b.class short s = 1000 // Short println s.class float f = 1.25 // Float - no need to add the f at the end println f.class paul = 52 // Integer - you don't even need the data type println paul.class def x = 52.6576534 // BigDecimal - using the def keyword instead of a specific data type println x.class // Groovy will automatically bump up the data type to match the number println 3.class // Integer println 432423423423443.class // Long println 975985793475098437598347958734.class // BigInteger println 1.345345.class // BigDecimal println 4.543757349875098437590437594378597345.class // BigDecimal // You can use underscores println 2_167_876.class // Integer // Display min and max values of a data type println(Short.MIN_VALUE) // -32768 println(Short.MAX_VALUE) // 32767 Note: if you know what type a value is going to be and it won't change you should really use that type |
There a few differences with Java and Groovy that you should be made aware of, these are shown in the examples below
| Groovy and Numbers | / Groovy Number Defaults // ---------------------------------------------------------------------- def number = 10 // Integer println number.class def decimal = 5.50 println decimal.class // BigDecimal // :: Converting Data Types :: // ---------------------------------------------------------------------- // Explicit - casting def myFloat = (float) 1.0 println myFloat.class // cast to a Float // Implicit - coercion def decimal = 5.50 println decimal.class // the conversion happens behind the scenes // Rules for +,-,* // ---------------------------------------------------------------------- // If either operand is a Float or a Double the result is a Double // In Java if only Floats are involved the result is a Float Float f = 5.25 Double d = 10.50 def result = d / f println result println result.class // Double Float a = 10.75 Float b = 53.75 def result2 = b / a println result2 println result2.class // Double // If either operand is a big decimal def x = 34.5 // BigDecimal def y = 15 def bigResult = x / y println bigResult println bigResult.class // BigDecimal // If either operand is a BigInteger the result is a BigInteger // If either operand is a Long the result is a Long // If either operand is a Integer the result is an Integer // Double division println 5.0d - 4.1d // results may be rounded println 5 - 4.1 // will give correct result // Integer Division def intDiv = 1 / 2 println intDiv // this is much different than Java where we would get 0 println intDiv.getClass().getName() println 1.intdiv(2) // this is more like Java |
| Groovy number methods | assert 2 == 2.5.toInteger() // conversion
assert 2 == 2.5 as Integer // enforced coercion
assert 2 == (int) 2.5 // cast
assert '5.50'.isNumber() // convert a string into a number
assert 5 == '5'.toInteger() // convert a string into a Integer
// times | upto | downto | step
20.times {
print '-'
}
1.upto(10) { num ->
println num
}
10.downto(1) { num ->
println num
}
0.step(1,0.1) { num ->
println num
} |
Groovy allows you to overload the various operators so that they can be used with your own classes, you have methods like plus(), minus(), multiply(), div(), power() and many more
| Overload example | def a = 1 def b = 2 println a + b // behind the scenes its uses the plus() method println a.plus(b) // the overloaded method def s1 = "Hello" def s2 = ", World!" println s1 + s2 println s1.plus(s2) // the overloaded method |
| Overload plus class method example | class Account {
BigDecimal balance
// the overloaded method (+), remember + is the plus() method
Account plus(Account other) {
new Account( balance: this.balance + other.balance )
}
String toString(){
"Account Balance: $balance"
}
}
Account savings = new Account(balance:100.00)
Account checking = new Account(balance:500.00)
println savings
println checking
println savings + checking // remember + is plus() method, it runs the overloaded method Account::plus |
Everything in Groovy in single or double quotes is a String unless you specific use a Character data type for a single character.
| String examples | char c1 = 'c'
println c1.class // Character
def c2 = 'c'
println c2.class // String
def str2 = 'this is a string'
println str2.class // String
// string interpolation
String name = "Paul"
String msg2 = "Hello ${name}" // String interpolation, must use double quotes
println msg2
String msg3 = 'Hello ${name}'
println msg3
String msg4 = "We can evaulate expressions here: ${1 + 1}"
println msg4 |
| Multi-line strings | // use triple quotes """ .... """
def aLargeMsg = """
A
Msg
goes
here and
keeps going ${1+1}
"""
println aLargeMsg |
| dollar slashy (escaping) | // the test is surrounded by $/ and /$ def folder = $/C:\groovy\paul\foo\bar/$ println folder |
Groovy can use regular expressions to search and manipulate strings, the three basic operators are below, there are a number of special symbols you can use which I have already documented in my Java Regular Expressions section.
Here are some regex examples
| Basic Regex | String slashy = /a\b/ println slashy println slashy.class String url = $/http://datadisk.co.uk/blog/$ // use the dollar slashy $/ .. /$ println url def pattern1 = ~/a\b/ // replaces the above println pattern1.class |
| Find and Match | def text = "Being a Cleveland Sports Fan is no way to go through life" // true
def pattern2 = ~/Cleveland Sports Fan/
def finder = text =~ pattern2
def matcher = text ==~ pattern2
println "finder: " + finder
println "finder size: " + finder.size()
println "matcher: " + matcher // must be exact match
// ----------------------------------------------------------------------------------
def text3 = "Cleveland Sports Fan"
def pattern3 = ~/Cleveland Sports Fan/
def matcher3 = text3 ==~ pattern3 // this is an exact match
println "matcher3: " + matcher3
if( matcher ) { /* do something */ }
// ----------------------------------------------------------------------------------
def text4 = "Being a Cleveland Sports Fan is no way to go through life" // true
def pattern4 = ~/Cleveland/
text = text4.replaceFirst(pattern4,"Buffalo")
println text |