[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 the first, last and born 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 named comparatorByFirst, comparatorByLast and comparatorByBorn
The properties within the class must themselves be 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

Optional 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

Inherited Methods
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