Search

Dark theme | Light theme

March 10, 2016

Groovy Goodness: Using Tuples

A tuple is an ordered, immutable list of elements. Groovy has it's own groovy.lang.Tuple class. We can create an instance of a Tuple by providing all elements that need to be in the Tuple via the constructor. We cannot add new elements to a Tuple instance or remove elements. We cannot even change elements in a tuple, so it is completely immutable. This makes it very useable as return value for a method where we need to return multiple values. Groovy also provides a Tuple2 class that can be used for tuple instance of only two elements. The elements are typed in a Tuple2 instance.

In the following example we see different uses of the Tuple and Tuple2 classes:

def tuple = new Tuple('one', 1, new Expando(number: 1))

assert tuple.size() == 3

// To get the value of an element
// at a certain position we use
// the get(index) method.
assert tuple.get(0) == 'one'

// We can use the [] syntax to
// get elements from the tuple.
assert tuple[1] == 1

// We can use methods added to the
// Collection API by Groovy.
assert tuple.last().number == 1

// We cannot change the tuple.
try {
    tuple.add('extra')
    assert false
} catch (UnsupportedOperationException e) {
    assert e
}

try {
    tuple.remove('one')
    assert false
} catch (UnsupportedOperationException e) {
    assert e
}

try {
    tuple[0] = 'new value'
    assert false
} catch (UnsupportedOperationException e) {
    assert e
}


// Create a Tuple with fixed size 
// of 2 elements, a pair.
def pair = new Tuple2('two', 2)

// The Tuple2 class has extra methods
// getFirst() and getSecond() to 
// access the values.
assert pair.first == 'two'
assert pair.second == 2

An example on how to use a Tuple2 as return value for a method:

def calculate(String key, Integer... values) {
    // Method return a Tuple2 instance.
    new Tuple2(key, values.sum())
}

// Use multiple assignment to
// extract the values from the tuple.
// Tuple2 has typed objects.
def (String a, Integer b) = calculate('sum', 1, 2, 3)

assert a == 'sum'
assert b == 6

Written with Groovy 2.4.6.