Bugfix Release 0.9.3
Info
The release increases stability and performance.
Please find the complete list of changes here.
The API Docs can be found here
Comitters
🎉 MANY THANKS TO ALL COMMITTERS THAT MADE THIS RELEASE POSSIBLE 🎉
- ⭐️ Andreas Gebhardt (@agebhar1)
- ⭐️ Audun Halland (@audunhalland)
- ⭐️ Daniel Dietrich (@danieldietrich)
- ⭐️ Igor Konoplyanko (@cauchypeano)
- ⭐️ J. B. Rainsberger (@jbrains)
- ⭐️ Jia Chen (@grievejia)
- ⭐️ Nándor Előd Fekete (@nfekete)
- ⭐️ Nataliia Privezentseva (@nataliiaprivezentseva)
- ⭐️ Ruslan Sennov (@ruslansennov)
- ⭐️ Sebastian Zarnekow (@szarnekow)
- ⭐️ Stephen Kestle (@skestle)
- ⭐️ Valery (@valery1707)
Bug fixes
🚨 LinkedHashMap duplicate entries
In Vavr 0.9.2, all LinkedHashMap
factory methods internally did not store keys and values correctly.
Example:
var map = LinkedHashMap(1, "1", 1, "2", 2, "3", 2, "4");
// = 2 (CORRECT)
map.size();
// = LinkedHashSet(1, 1, 2, 2) (WRONG)
// = LinkedHashSet(1, 2) (FIXED)
map.keySet() = LinkedHashSet(1, 1, 2, 2)
// = List("1", "2", "3", "4") (WRONG)
// = List("2", "4") (FIXED)
map.values() = List(1, 2, 3, 4)
Details can be found here.
🚨 TreeSet fell back to natural comparator after removing all elements
// = TreeSet(2, 1)
var set1 = TreeSet.ofAll(Comparator.reverseOrder(), List(1, 1, 2, 2));
// = TreeSet() has now natural comparator (WRONG)
// = TreeSet() keeps reverse order (FIXED)
var set2 = set1.removeAll();
// = TreeSet(1, 2) (WRONG)
// = TreeSet(2, 1) (FIXED)
set2.addAll(List(1, 1, 2, 2));
Details can be found here.
🚨 Stream flatMap memory consumption
Stream.flatMap used an inner class for iteration, with the effect of the result stream holding an unnecessary indirect reference to the head of the source stream, resulting in a "temporary" memory leak.
However, when the reference to the original Stream was garbage-collected, the memory was completely freed.
Details can be found here.
Performance improvements
🏁 Hash code calculation
Internally, we relied on
Objects.hash(T... varargs)
for hashCode calculation. A call
Objects.hash(1, 2, 3)
results in an array creation. In order to prevent that unnecessary instance creation, we added internal methods that preserve our hash semantics.
🏁 Micro-optimizations of collections
We did some micro-optimizations to
CharSeq.ofAll(Iterable)
CharSeq.prependAll(Iterable)
Vector.ofAll(Iterable)
Vector.appendAll(Iterable)
Vector.prependAll(Iterable)
Low-level details can be found here.
New API
🎉 Map additions
We follow the Semantic Versioning scheme. Although this release is a patch release, there are two new methods:
I hope, your OSGi infrastructure does not complain about it.
Jar files
📦 Separate annotation processor jar
We separated annotation vavr-match-processor-<version>.jar
from vavr-match-<version>.jar
.
If you want to create your own pattern matching patterns, you need to include these two dependencies now instead of only vavr-match
.
Documentation
📚 Javadoc improvements
- We clarified that
LinkedHashMap.put(K, V)
andLinkedHashMap.add(T)
have a worst-case linear complexity. This is because equal elements need to be replaced while preserving their position. - Several small improvements and fixes
Other improvements
- Improved interoperability with the GWT compiler
- Improved Eclipse integration for Vavr committers