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. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments