Groovy

Groovy Weekend – Collections: Injecting or Map Reduce

I’ve been working with Groovy for some time now and I think it’s one of the best languages for the JVM.

To show my love for this language I dedicate this weekend to showcase some of the enhancements Groovy has made to working with Lists, Maps and Collections. Some small tidbits – just for fun.

In this 7th installment of the Groovy Weekend Collections Showcase Reel…


inject

inject() is a method on Collection which iterates all elements, passing 1st item to specified closure, injecting results back into closure with 2nd item, etc

First an abstract example:

assert 1 * 2 * 3 * 4 == 
    [1, 2, 3, 4].inject { current, val -> current * val }

And – as you would expect by now – some animals:

class Animal {
    String name
    BigDecimal price
    String farmer
}

def animals = []
animals << new Animal(name: "Buttercup", price: 2, farmer: "john")
animals << new Animal(name: "Carmella", price: 5, farmer: "dick")
animals << new Animal(name: "Cinnamon", price: 2, farmer: "dick")

// gather the total price of all animals, passing initial price of 0
assert 9 == animals.inject(0) { totalPrice, animal -> 
    totalPrice + animal.price 
}
// or...
assert 9 == animals.price.inject(0) { totalPrice, price -> 
    totalPrice + price
}

There are some variants of inject, one which takes an initial value and one which takes the head of the collection as initial value. Check out Groovy’s GDK documentation.