Since Groovy 2.1 we have a couple of extra methods available for objects that implement the java.lang.Appendable
interface. A lot of Writer objects implement this interface. The documentation of the Appendable
interface mentions: An object to which char
sequences and values can be appended.
First the leftShift()
method is added. This means we can use the leftShift operator (<<) to append a value. Then we also can use the withFormatter()
method. We can pass a closure to this method or a java.util.Locale
object and a closure. The closure has a single parameter which is a java.util.Formatter
instance. We can use this method to add printf-style formatted strings to an Appendable
object. If we pass a Locale
object to the method the Formatter
is created with the specified Locale
to created localized printf-sytle formatted strings.
// Create object that implements the Appendable interface. final Appendable appendable = new StringWriter() assert appendable in Appendable // Use leftShift operator to add to Appendable implementation. appendable << 'Groovy is Gr8!' << newLine // Use withFormatter() method. // Formatter object // is passed to closure as parameter. appendable.withFormatter { formatter -> // Simple formatter pattern to reorder the arguments. formatter.format(/m r %3$1s %2$1s %1$1s %4$1s%n/, 'k', 'a', 'h', 'i') } // Use withFormatter() method and use Locale object // as extra argument. The Locale is passed on // to create the Formatter object. appendable.withFormatter(Locale.US) { formatter -> formatter.format("US: " + datePattern, date) } // Use different Locale. appendable.withFormatter(new Locale('nl')) { formatter -> formatter.format("Dutch: $datePattern", date) } // Check result is as expected: assert appendable.toString() == '''Groovy is Gr8! m r h a k i US: January 27, 2013 Dutch: januari 27, 2013 ''' // Helper getters: String getNewLine() { System.getProperty('line.separator') } Date getDate() { // Simple date to use in withFormatter() methods. Date.parse('yyyy-MM-dd', '2013-01-27') } String getDatePattern() { // Date pattern for Formatter. '%1$tB %1$te, %1$tY%n' }
Code written with Groovy 2.1