Andrey Hihlovskiy
Professional blog on groovy, gradle, Java, Javascript and other stuff.
Monthly Archives: August 2013
Groovy language, spaceship operator
August 28, 2013
Posted by on x <=> y
Useful in comparisons:
- returns -1 if x is smaller than y
- return 0 if x equals to y
- returns 1 if x is greater than y.
Isn’t it sweet?
Groovy DSL == thermonuclear way of writing XML
August 7, 2013
Posted by on import groovy.xml.MarkupBuilder String createEAD(Closure closure) { def writer = new StringWriter() def xml = new MarkupBuilder(writer) xml.mkp.xmlDeclaration(version: '1.0', encoding: 'UTF-8') xml.'ead:ead'('xmlns:ead': 'urn:isbn:1-931666-22-9') { closure.delegate = new Object() { def text(Map attrs, content) { def a = attrs.keySet().find { it in ['bold', 'italic', 'underline'] } if(a && attrs[a]) { xml.'ead:emph' render: a, { text attrs.findAll({ it.key != a }), content } } else text content } def text(content) { if(content instanceof String) xml.mkp.yield content else if(content instanceof Closure) content() } } closure() } return writer.toString() } println createEAD { text bold: true, italic: true, { text 'Hello, ' text underline: true, 'world!' } }
expected output:
<?xml version='1.0' encoding='UTF-8'?> <ead:ead xmlns:ead='urn:isbn:1-931666-22-9'> <ead:emph render='bold'> <ead:emph render='italic'>Hello, <ead:emph render='underline'>world!</ead:emph> </ead:emph> </ead:emph> </ead:ead>
Partial interface implementation in groovy
August 6, 2013
Posted by on interface X { void a() void b() } class XAdapter implements X { void a() { println 'default implementation of a' } void b() { println 'default implementation of b' } } def o = [ a: { println 'overridden implementation of a' } ] as XAdapter o.a() o.b()
will output:
overridden implementation of a
default implementation of b
Fun with groovy files
August 1, 2013
Posted by on The following one-liner can copy very large files without running out of memory:
new File("test").withInputStream { new File("test2") << it }
Just tested it in groovy console – 1 GB file is copied in 5 seconds, memory consumption stays low.
The copy is binary, i.e. it copies bytes, not chars.
One particularity: left-shift operator rather appends than overwrites. If you need to overwrite the file, first need to delete it.
Fun with groovy maps and function call syntax
August 1, 2013
Posted by on A function having a Map as first parameter:
void doIt(Map attrs, Object content) { println attrs println content }
supports equally valid call syntax variations:
// "classical" call syntax, known from java world doIt([color: 'red', type: 'fruit'], 'hello!') // parentheses can be omitted doIt [color: 'red', type: 'fruit'], 'hello!' // even square brackets for map can be omitted doIt color: 'red', type: 'fruit', 'hello!' // order of map properties does not matter, // map properties can be intermixed with unnamed parameters. doIt color: 'red', 'hello!', type: 'fruit' doIt 'hello!', type: 'fruit', color: 'red'
this effectively allows to implement named parameters in groovy.
Recent Comments