Annotation Type Sortable


  • @Retention(RUNTIME)
    @Target(TYPE)
    public @interface 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']
     
    Author:
    Andres Almiray, Paul King
    • Optional Element Summary

      Optional Elements 
      Modifier and Type Optional Element Description
      java.lang.String[] excludes
      Property names to exclude in the comparison algorithm.
      java.lang.String[] includes
      Property names to include in the comparison algorithm.
    • Element Detail

      • includes

        java.lang.String[] includes
        Property names to include in the comparison algorithm. Must not be used if 'excludes' is used.
        Default:
        {}
      • excludes

        java.lang.String[] excludes
        Property names to exclude in the comparison algorithm. Must not be used if 'includes' is used.
        Default:
        {}