we would like to give you a brief overview about the past, present and future of Javaslang.
Javaslang is an open source project, created and led by Daniel Dietrich. Over time it evolved to an open source organization, consisting of several sub-projects. The developers of Javaslang are carrying out lively discussions day by day. Voluntary contributions are greatly appreciated.
Our first steps
The development already started in 2013, based on early access releases of Java 8. Daniel had the vision to bring missing, Scala like features to Java 8 that allow us to pursue an object-functional programming style.
Release 1.0 was pretty much like Guava. Beside the control structures Option and Either it included utilities that leveraged the new Lambda feature in order to ease daily programming tasks and make code more concise.
To that time we didn't follow the semantic versioning scheme - but later more on that. Looking back, the 1.0 release was in fact in beta state.
Release 1.1 was more mature. We added the Monad abstraction, first collections and more control structures, like Try.
Release 1.2 was a cornerstone. It hardened the previous release and re-organized algebraic features into a separate package. Also it included the property testing framework and a first version of the pattern matching API.
A full blown collection library
The coherent types and the feature rich persistent collection library made Javaslang 2.0 different. We focused on interoperability with Java 8 and composability. The 2.0 release was a huge effort, it included 1943 commits.
We added Future and Promise for concurrent programming and re-designed the pattern match API. Beside the new control structure Validation we added several new collection types, including different Sets and Maps. Javaslang started to look pretty slick :)
With Javaslang 2.0 we also placed more value on following the semantic versioning scheme mentioned above. Starting from this point we stay (binary) backward compatible. Also release 1.2.3 is backward compatible to 1.2.2.
Bug fixes might change the semantics of operations if these do not work as expected regarding the API documentation.
More features & performance improvements
The upcoming 2.1.0 release contains already more than 600 commits thanks to our contributors from all over the world. Because it is a minor release, it will contain only additions to the existing API without breaking backward compatibility.
Beside tons of new functions on existing types and many performance improvements the following additions are noteworthy:
- A re-implementation of Vector by Pap Lőrinc
- Multimap implementations (Hash, Linked and Sorted) by Ruslan Sennov
- PriortiyQueue by Pap Lőrinc
- BitSet by Ruslan Sennov
Javaslang does not have to hide. In fact we work hard to perform better than our coevals. We created a benchmark framework based on JMH to measure the performance and memory footprint of our persistent collections. An upcoming blog post will compare Javaslang's collections with those of Scala, Clojure, PCollections, Functional Java and Eclipse Collections.
What comes next?
We think evolution is not possible without changing existing things. Java doesn't do it. Scala did it in the past but got more conservative over time. Swift 3 will include many breaking changes to make the language better.
Having semantic versioning, major versions break things by definition. But major versions should not appear often. We will maintain the 1.x and 2.x streamlines. Javaslang 3 will be the next evolution step.
We are still planning the changeset of Javaslang 3. A list of proposals can be found here. Because it is a major release, we have the opportunity to remove unnecessary and deprecated functionality. We will consider to rename things (e.g. CheckedFunction1 vs ThrowableFunction1), change types (e.g. int indexes instead of long indexes) etc.
We hope you are as excited as we are looking at the future of Javaslang :)
- Daniel Dietrich