13. Higher Order of Functionality
Today's tips is to explore the world of Higher Order Functionality and how to work with functions that operates on functions.
In the good old pre-Java 8 days, algorithms mostly operated on data structures. But with the introduction of functions in Java 8, our programs may now also reason about behavior. Programming a program that operates on other programs opens up a whole new level of abstractions which allows for elegant declarative programs that express what to be done rather than how, leaving the details about the execution to a framework that performs the operation from "what" to "how" as a higher order operation.
We could, for example, write a QuickSort algorithm that may sort anything (that extends Object) stored anyhow by just providing functional parameters in the form of a getter, a comparer, a swapper and the number of elements to sort. This enables the QuickSort algorithm to sort lists, arrays or even serialized off heap objects using the same basic algorithm. The QuickSort algorithm just applies the provided functions agnostically. Thus, we only need to write QuickSort once and then we can re-use it by just providing the appropriate functions.
Speedment is an Open Source ORM with an API founded on Java 8 streams. With Speedment you can apply functions that takes functions as a parameter. For example you can:
users.stream()
.filter(User.BORN.between(1985, 1995)) // Filters out Users born 1985 up to and including 1994
.map(User.CATEGORY.setTo(3)) // Applies a function that sets their category to 3
.forEach(users.updater()); // Applies the updater function to the selected users
The code snippet above will;
a) extract users from an underlying database where the users are born between 1985 and 1995 (and only those users)
b) for each such user, it will apply a mapping from a user to an updated user where the category has been set to 3 (but all other fields remain the same)
c) for each updated user, a database updater method will be applied that will result in the updated user being persisted in the database.
So, the snippet above is a sequence of methods that are provided other methods as per the paradigm of Higher Order of Functionality. If we later elect to store our data not in a database but in a file, in memory or even in an Excel diagram, then we only need to provide another set of functions. The stream logic will remain exactly the same.
Read more on Higher Order of Functionality here.
Follow the Java Holiday Calendar 2016 with small tips and tricks all the way through the winter holiday season.