Java 8 introduced lambda expressions we can use for example with the new Java Streams API. The Groovy syntax doesn't support the lambda expressions, but we can rely on closure coersion to use Groovy closures as Java lambda expressions in our code.
In the following sample we use the Java Streams API. Instead of lambda expressions for the filter
and map
methods we use Groovy closures. They are automatically transformed to lambda expressions, so it is very easy to use Java streams from Groovy code.
Continue reading →
So this year I got the opportunity to speak and visit Greach 2015 in Madrid, Spain. I've never been in Spain before, but after visiting I definitely want to go back. Although the trip to Madrid was more cumbersome than planned, because of the strikes in France, I arrived at the speaker's dinner on time. Just go to mention that the Madrid metro is a very pleasant way to go around in Madrid. It was good to see old and new faces and to catch up and just have fun. Friday April 10th was the first day of the conference. The conference is held at the university in the south of Madrid. Jochen Theodorou, one of the Groovy core developers, opened the day with the keynote about Groovy's past, present and future. He gave a very nice overview of how Groovy evolved over the years and Groovy has been around already for a long time. Of course the latest news this year is Pivotal's hands off of Groovy and Grails. Jochen explained he first gets a good vacation and then decides what to do himself. Groovy is now in the process of getting an Apache project so the continuity of the development of the language should be saved. Then the rest of the day two tracks were presented at the same time. And there were difficult choices to make. Fortunately all talks are recorded and they will be added to the Greach Youtube channel.
I went to the talk Groovy and Scala: Friends or Foes by Marco Vermeulen. He showed how we can use Spock with Groovy to test Scala code using a Gradle build. So both worlds can live together and we can intermingle where possible. The application written in Scala was pragmatic and that is something I missed when I looked at Scala for the first time. This talk really got me interested to learn more about Scala. Next up was the talk AST - Groovy Transformers: More than meets the eye! by one of the conference organizers Iván López. He showed a lot of the (local) AST transformation that are already available in Groovy and that we can use everyday in our programs. Each AST transformation was clearly explained and he showed samples on how to use them. After his talk it was my time to present Grails Goodness. In this talk I live coded a selection of the blog posts about Grails I did write. Somehow there is always to little time to show everything I wanted, but still I think I was able to show some nice features of Grails.
Continue reading →
In Groovy we can use the sort
and unique
methods to sort a collection or remove duplicates from a collection. These methods alter the collection on which they are invoked. This is a side effect we might want to avoid. Therefore the sort
and unique
methods where changed and we could pass a boolean
argument to indicate if the original collection should be changed or that we must have a new collection as the result of the methods, leaving the original collection untouched. Since Groovy 2.4 we have two new methods which by default return a new collection: toSorted
and toUnique
.
In the following sample we see the new methods in action:
Continue reading →
Since Groovy 2.4.0 we can get the indices from the elements in a collection with the indices
method. In addition to this method we can also use the withIndex
to combine an Iterable
with the indices directly. The output is a List
of tuples where the first item is the value of the Iterable
and the second the index value. We can pass an optional argument to the withIndex
which is the starting point for the index values. Another alternative is the indexed
method. The indexed
method returns a Map
, where the key of the entry is the index value and the entry value is the Iterable
value.
In the following example we use the withIndex
method. The sample of the alphabet is the same as in the blog post about indices, but rewritten with the withIndex
method:
Continue reading →
Groovy already has so many extra methods for working with collections. If we have to need to swap two elements in a collection we can use the swap
method. We provide the two index values of the elements we want to swap and Groovy swaps the elements.
In the following sample we have a simple list and swap all elements by invoking the swap
method two times:
Continue reading →
In Java 8 we can create a constructor reference. We must use the syntax Class::new
and we get a constructor reference. This syntax is not supported in Groovy, but we can use the method pointer or reference syntax .&
to turn a method into a closure. We can even turn a constructor into a closure and use it everywhere where closures are allowed.
In the following sample code we have a User
class with some properties. Via the User.metaClass
we can get a reference to the method invokeConstructor
and turn it into a method closure:
Continue reading →
To define system properties for our Gradle build we can use the command line option --system-prop
or -D
. But we can also add the values for system properties in the gradle.properties
file of our project. This file contains project properties we want to externalized, but if we prefix the property name with systemProp.
the property is turned into a system property. For a multi-module build only system properties defined in the gradle.properties
file in the root of the project structure are used, others are ignored.
In the following build script we have the task showSystemProperty
. Inside the task we assert the value of the system property sample
and the project property sample
:
Continue reading →
One of the great features of Asciidoctor is the support for extensions. If we want to have some special feature we want to use, but is not supported by Asciidoctor, we can add our own extension. On the Java platform we can write those extensions in for example Java and Groovy. When we use Gradle as the build tool with the Asciidoctor plugin we can write the code for the extension in our Gradle build file with the Groovy extension DSL.
Suppose we want to write a new inline macro that will transform the following markup issue:PRJ-100[]
into a link that points to the web page for issue PRJ-100. First we create our Asciidoctor source document:
Continue reading →
Creating a list with Asciidoctor markup is easy. To create an unordered we need to start a line with an asterisk (*
) or hypen (-
). We can add some extra markup to create a checked list. If we add two square brackets ([]
) to the list item we have a checklist. To have an unchecked item we use a space, for a checked item we can use a lowercase x (x
) or an asterisk (*
).
In the next example we define a shopping cart list with Asciidoctor markup:
Continue reading →
With Asciidoctor we can create numbered lists easily. When we want to change the number the list starts with we use the start
attribute when we define the list.
== Numbered List
.Default
. Makes writing easy
.. Keep focus
.. Syntax
. Different output formats
// Start this list from 10.
[start=10]
.Start from 10
. Makes writing easy
// We can use it on all levels.
[start=10]
.. Keep focus
.. Syntax
. Different output formats
Continue reading →
Document attributes are like variables for your Asciidoctor document. Normally when we reference an attribute that is not set in our Asciidoctor markup the reference is still in the output. This is very handy, because we immediately see that a document attribute is not set. But we can customize this behavior with the document attribute attribute-missing
. We can use the default value skip
, which leaves the reference in the output. Another option is drop
, which means the reference is dropped from the output. Finally we can set the value to drop-line
, where the complete line with the attribute reference is dropped from the output.
In the following sample Asciidoctor markup we set the three values for the attribute attribute-missing
:
Continue reading →
Recently I had to access the XML-RPC WordPress API for a small project. Luckily with Groovy we can access a XML-RPC server in a Groovy way. We need to use the Groovy XML-RPC module, which is a separate dependency. The module provides code to write a XML-RPC server, but also code to access a XML-RPC server as client. We use the class XMLRPCServerProxy
in the package groovy.net.xmlrpc
to act as a client to a XML-RPC API. The XMLRPCServerProxy
class only needs to know the URL to access the API. All API methods are dynamically dispatched to the server, so it is very flexible.
In the following Groovy script we use the WordPress XML-RPC API to access posts:
Continue reading →