
- Groovy Tutorial
- Groovy - Home
- Groovy - Overview
- Groovy - Environment
- Groovy - Basic Syntax
- Groovy - Data Types
- Groovy - Variables
- Groovy - Optionals
- Groovy - Numbers
- Groovy - Strings
- Groovy - Ranges
- Groovy - Lists
- Groovy - Maps
- Groovy - Dates & Times
Groovy Operators
- Groovy - Operators
- Groovy - Arithmetic Operators
- Groovy - Assignment Operators
- Groovy - Relational Operators
- Groovy - Logical Operators
- Groovy - Bitwise Operators
- Groovy - Spaceship Operator
- Groovy - in Operator
- Groovy - Elvis Operator
- Groovy - Safe Navigation Operator
- Groovy Operator Precedence & Associativity
Control Statements
- Groovy - Decision Making
- Groovy - If Else Statement
- Groovy - Switch Statement
- Groovy - Loops
- Groovy - For Loop
- Groovy - For-in Loop
- Groovy - While Loop
- Groovy - Do While Loop
- Groovy - Break Statement
- Groovy - Continue Statement
Groovy File Handling
- Groovy - File I/O
- Java - Create a File
- Java - Write to File
- Java - Append to File
- Java - Read Files
- Java - Delete Files
- Java - File Properties
- Java - File Existence and Type
- Java - File Size
- Java - File Permissions
- Java - Directories
- Java - Listing Directories
- Java - Filtering Files/Directories
- Java - Deleting Directories
- Java - Renaming Files/Directories
Groovy Error & Exceptions
- Groovy - Exception Handling
- Groovy - try-catch Block
- Groovy - try-with-resources
- Groovy - Multi-catch Block
- Groovy - Nested try Block
- Groovy - Finally Block
- Groovy - throw Exception
- Groovy - Exception Propagation
- Groovy - Built-in Exceptions
- Groovy - Custom Exception
Groovy Multithreading
- groovy - Multithreading
- groovy - Thread Life Cycle
- groovy - Creating a Thread
- groovy - Starting a Thread
- groovy - Joining Threads
- groovy - Naming Thread
- groovy - Thread Scheduler
- groovy - Thread Pools
- groovy - Main Thread
- groovy - Thread Priority
- groovy - Daemon Threads
- groovy - Shutdown Hook
Groovy Synchronization
- groovy - Synchronization
- groovy - Block Synchronization
- groovy - Static Synchronization
- groovy - Inter-thread Communication
- groovy - Thread Deadlock
- groovy - Interrupting a Thread
- groovy - Thread Control
- groovy - Reentrant Monitor
- Groovy - Methods
- Groovy - Methods
- Groovy - Optional parenthesis
- Groovy - Named Arguments
- Groovy - Closures as Arguments
- Groovy - Method Overloading
- Groovy - Method Scope and Visibility
- Groovy - isCase Method
- Groovy - Implicit Return
- Groovy - Variable Arguments
- Groovy - Regular Expressions
- Groovy - Regular Expressions
- Groovy - Defining Regular Expressions
- Groovy - Matcher Object
- Groovy - Regex Tasks
- Groovy - XML
- Groovy - XML
- Groovy - Parsing XML
- Groovy - Creating XML
- Groovy - Modifying XML
- Groovy - Querying XML
- Groovy - Simplified Notation
- Groovy - Closure based Querying
- Groovy - Closure based Creation
- Groovy - JSON
- Groovy - JSON
- Groovy - Parsing JSON
- Groovy - Creating JSON using JsonOutput
- Groovy - Creating JSON using JsonBuilder
- Groovy - Modifying JSON
- Groovy - Error Handling
- Groovy - Handling JSON Arrays
- Groovy - JSON Array Operations
- Groovy - JSON Objects
- Groovy - JSON Object Operations
- Groovy - Generics
- Groovy - Generics
- Groovy - Declaring Generic Types
- Groovy - Bound Type Parameters
- Groovy - Wild Cards
- Groovy - Miscellaneous
- Groovy - Object Oriented
- Groovy - Closures
- Groovy - Annotations
- Groovy - JMX
- Groovy - DSLS
- Groovy - Database
- Groovy - Builders
- Groovy - Command Line
- Groovy - Unit Testing
- Groovy - Template Engines
- Groovy - Meta Object Programming
- Groovy Useful Resources
- Groovy - Quick Guide
- Groovy - Useful Resources
- Groovy - Discussion
Groovy - Custom Ranges
We can define a range of custom objects as well. An object must be comparable and it is good to implement next() method so that Groovy knows how to progress from one object to another object.
In order a create a custom object which can be used in a Range, we should implement Comparable interface. As Comparable interface provides compareTo() method which assists in defining the natural ordering of objects. Groovy needs object to have next() method as well so that next object can be determined. Let's create a object step by step which can be used in a range.
Create Version Class implementing Comparable Interface
class Version implements Comparable<Version> { int major; int minor; int patch; Version(int major, int minor, int patch) { this.major = major; this.minor = minor; this.patch = patch; } @Override int compareTo(Version other) { if (major != other.major) { return major <=> other.major; if (minor != other.minor) { return minor <=> other.minor; } return patch <=> other.patch; } }
Here
We've defined a class Version which is implementing the Comparable interface.
Version has three properties, to define a version as major.minor.patch
In compareTo() method implementation, we're first comparing the major and then minor and then patch.
compareTo() method returns zero, if objects are same, returns negative integer if object is lesser that other object and a positive integer if object is greater than other object compared.
Implement next() method to assist progresson
Version next() { return new Version(major, minor, patch + 1); }
Here we're implementing next version object as a patch release incremented by 1.
Implement toString() method to print object
String toString() { return "${major}.${minor}.${patch}"; }
Here we're printing a version as major.minor.patch
Example - Creating a Range of Custom Object, Version
Example.groovy
class Example { static void main(String[] args){ // Create instances of the Version class def v100 = new Version(1, 0, 0); def v105 = new Version(1, 0, 5); // Create range of version objects def versionRange = v100..v105; // print the list of version objects println versionRange.toList(); // iterate through version objects for (version in versionRange) { println "Version: $version" } } } class Version implements Comparable<Version> { int major; int minor; int patch; Version(int major, int minor, int patch) { this.major = major; this.minor = minor; this.patch = patch; } @Override int compareTo(Version other) { if (major != other.major) { return major <=> other.major; } if (minor != other.minor) { return minor <=> other.minor; } return patch <=> other.patch; } Version next() { return new Version(major, minor, patch + 1); } String toString() { return "${major}.${minor}.${patch}"; } }
Output
When we run the above program, we will get the following result −
[1.0.0, 1.0.1, 1.0.2, 1.0.3, 1.0.4, 1.0.5] Version: 1.0.0 Version: 1.0.1 Version: 1.0.2 Version: 1.0.3 Version: 1.0.4 Version: 1.0.5