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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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.