[Java] Annotation Type Sortable
- groovy.transform.Sortable
A class annotation used to make a class Comparable by multiple Comparators. As an example, given this class:
@Sortable
class Person {
String first
String last
Integer born
}
The generated Groovy class will: - implement the
Comparable
interface - have a
compareTo
method based on thefirst
,last
andborn
properties (priority ordering will be according to the ordering of property definition, highest first, unless 'includes' is used; in which case, priority will be according to the order given in the includes list) - have three
Comparator
methods namedcomparatorByFirst
,comparatorByLast
andcomparatorByBorn
Comparable
or @Sortable
. More examples:
//-------------------------------------------------------------------------- import groovy.transform.Sortable import groovy.transform.ToString @Sortable @ToString class Course { // Order of properties determines priority when sorting String title Date beginDate Integer maxAttendees // int doesn't implement Comparable, so use Integer } final Course groovy = new Course( title: 'Groovy', beginDate: new Date() + 7, maxAttendees: 40) final Course groovy2 = new Course( title: 'Groovy', beginDate: new Date() + 2, maxAttendees: 50) final Course grails = new Course( title: 'Grails', beginDate: new Date() + 1, maxAttendees: 20) final List<Course> courses = [groovy, groovy2, grails] assert courses.last().title == 'Grails' // Use toSorted() method to sort final List<Course> sorted = courses.toSorted() assert sorted.first().title == 'Grails' assert sorted.last().title == 'Groovy' assert sorted.maxAttendees == [20, 50, 40]
//-------------------------------------------------------------------------- // Order of fields for includes determines priority when sorting import groovy.transform.Sortable import groovy.transform.ToString @Sortable(includes = ['title', 'maxAttendees']) // Or @Sortable(excludes = ['beginDate']) @ToString class Course { String title Date beginDate Integer maxAttendees } final Course groovy = new Course( title: 'Groovy', beginDate: new Date() + 7, maxAttendees: 40) final Course groovy2 = new Course( title: 'Groovy', beginDate: new Date() + 2, maxAttendees: 50) final Course grails = new Course( title: 'Grails', beginDate: new Date() + 1, maxAttendees: 20) final List<Course> courses = [groovy, groovy2, grails] // Use toSorted() method to sort final List<Course> sorted = courses.toSorted() assert sorted.first().title == 'Grails' assert sorted.last().title == 'Groovy' assert sorted.maxAttendees == [20, 40, 50] //-------------------------------------------------------------------------- // Static methods to create comparators. final Comparator byMaxAttendees = Course.comparatorByMaxAttendees() final List<Course> sortedByMaxAttendees = courses.sort(false, byMaxAttendees) assert sortedByMaxAttendees.maxAttendees == [20, 40, 50] // beginDate is not used for sorting assert sortedByMaxAttendees[2].beginDate < sortedByMaxAttendees[1].beginDate assert Course.declaredMethods.name.findAll { it.startsWith('comparatorBy') }.toSorted() == ['comparatorByMaxAttendees', 'comparatorByTitle']
- Authors:
- Andres Almiray
- Paul King
Element Summary
Type | Name and Description |
---|---|
String[] |
excludes Property names to exclude in the comparison algorithm. |
String[] |
includes Property names to include in the comparison algorithm. |
Inherited Methods Summary
Methods inherited from class | Name |
---|---|
class Object | wait, wait, wait, equals, toString, hashCode, getClass, notify, notifyAll |
Element Detail
public String[] excludes
Property names to exclude in the comparison algorithm. Must not be used if 'includes' is used. @default {}
public String[] includes
Property names to include in the comparison algorithm. Must not be used if 'excludes' is used. @default {}
© 2003-2020 The Apache Software Foundation
Licensed under the Apache license.
https://docs.groovy-lang.org/2.4.21/html/gapi/groovy/transform/Sortable.html