Groovy Goodness: Intersect Collections With Custom Comparator
In a previous postwe learned about the intersect
method added to collections in Groovy.
Since Groovy 2.5.0 we can supply a custom Comparator
to the intersect
method to define our own rules for the intersection.
In the following example we first apply the intersect
method with the default Comparator
.
Then we create a new Comparator
using a closure where we check if the value is in both collections and if the value starts with the letter M:
def stuff = ['Groovy', 'Gradle', 'Grails', 'Spock', 'Micronaut', 'Ratpack'] as Set
def micro = ['Ratpack', 'Micronaut', 'SpringBoot', 'Microservice']
// Using default comparator to get values
// that are in both collections.
assert stuff.intersect(micro) == ['Ratpack', 'Micronaut'] as Set
assert micro.intersect(stuff) == ['Micronaut', 'Ratpack']
// Comparator to check if value is in
// both collection and starts with a 'M'.
def microName = { a, b -> a <=> b == 0 && a[0] == 'M' ? 0 : -1 } as Comparator
// This time we use the Comparator and
// end up with all elements in both
// collections that start with a 'M'.
assert stuff.intersect(micro, microName) == ['Micronaut'] as Set
assert micro.intersect(stuff, microName) == ['Micronaut']
Written with Groovy 2.5.0.