Vavr is a powerful library for Java 8+, built on top of Java lambda expressions. Inspired by the Scala language, Vavr adds functional programming constructs to the Java language, such as pattern-matching, control structures, data types, persistent and immutable collections, and more.
In this short article, we'll show how to use some of the factory methods to create Vavr collections. If you are new to Vavr, you can start with this introductory tutorial which in turn has references to other useful articles.
2. Maven Dependency
To add the Vavr library to your Maven project, edit your pom.xml file to include the following dependency:
<dependency> <groupId>io.vavr</groupId> <artifactId>vavr</artifactId> <version>0.9.1</version> </dependency>
You can find the latest version of the library on the Maven Central repository.
3. Static Factory Methods
Using the static import:
static import io.vavr.API.*;
we can create a list using the constructor List(…):
List numbers = List(1,2,3);
instead of using the static factory method of(…):
List numbers = List.of(1,2,3);
Tuple t = Tuple('a', 3);
Tuple t = Tuple.of('a', 3);
This syntactic sugar is similar to the constructs in Scala/Kotlin. From now on, we'll use these abbreviations in the article.
4. Creation of Option Elements
The Option elements are not collections but they can be very useful constructs of the Vavr library. It's a type that allows us to hold either an object or a None element (the equivalent of a null object):
Option<Integer> none = None(); Option<Integer> some = Some(1);
5. Vavr Tuples
Similarly, Java doesn't come with tuples, like ordered pairs, triples, etc. In Vavr we can define a Tuple that holds up to eight objects of different types. Here's an example that holds a Character, a String and an Integer object:
Tuple3<Character, String, Integer> tuple = Tuple('a', "chain", 2);
6. The Try Type
The Try type can be used to model computations that may or may not raise an exception:
Try<Integer> integer = Success(55); Try<Integer> failure = Failure(new Exception("Exception X encapsulated here"));
In this case, if we evaluate integer.get() we'll obtain the integer object 55. If we evaluate failure.get(), an exception will be thrown.
7. Vavr Collections
We can create collections in many different ways. For Lists, we can use List.of(), List.fill(), List.tabulate(), etc. As mentioned before, the default factory method is List.of() that can be abbreviated using the Scala style constructor:
List<Integer> list = List(1, 2, 3, 4, 5);
We can also create an empty list (called a Nil object in Vavr):
In an analogous way, we can create other kinds of Collections:
Array arr = Array(1, 2, 3, 4, 5); Stream stm = Stream(1, 2, 3, 4, 5); Vector vec = Vector(1, 2, 3, 4, 5);
We've seen the most common constructors for the Vavr types and collections. The syntactic sugar provided by the static imports mentioned in section 3 makes it easy to create all the types in the library.
You can find all the code samples used in this article in the GitHub project.