In a previous post we 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 -> def comp = a <=> b comp == 0 ? a[0] == 'M' ? 0 : -1 : comp } 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.