Groovy Goodness: Intersect Collections With Custom Comparator [Snippet]
Let's take a look at how to implement your own custom Comparator with the intersect method in Groovy.
Join the DZone community and get the full member experience.
Join For FreeIn a previous post, we learned about the intersect
method being 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.
Published at DZone with permission of Hubert Klein Ikkink, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments