Sortable (groovy 2.4.9 API)
Date: 2017-02-24

Package: groovy.transform

## [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 {}