MapIterable.getOrDefault() : New but not so new API
Eclipse Collections comes with it’s own List, Set, and Map implementations. These implementations extend the JDK List, Set, and Map implementations for easy interoperability. In Eclipse Collections 10.3.0, I introduced a new API MapIterable.getOrDefault()
. In Java 8, Map.getOrDefault()
was introduced, so what makes it a new API for Eclipse Collections 10.3.0? Technically, it is new but not so new API! Consider the code snippets below, prior to Eclipse Collections 10.3.0:
As you can see in the code, MutableMap
has getOrDefault()
available, however ImmutableMap
does not have it. But there is no reason why ImmutableMap
should not have this read-only API. I found that MapIterable
already had getIfAbsentValue()
which has the same behavior. Then why did I still add getOrDefault()
to MapIterable
?
I added MapIterable.getOrDefault()
mainly for easy interoperability. Firstly, most Java developers will be aware of the getOrDefault()
method, only Eclipse Collections users would be aware of getIfAbsentValue()
. By providing the API same as the JDK it reduces the necessity to learn a new API. Secondly, even though getOrDefault()
is available on MutableMap
, it is not available on the highest Map
interface of Eclipse Collections. Thirdly, I got to learn a Java compiler check which I had not experienced before. I will elaborate this check a bit more in detail because I find it interesting.
After I added getOrDefault()
to MapIterable
, various Map
interfaces in Eclipse Collections started giving compiler errors with messages like: org.eclipse.collections.api.map.MutableMapIterable inherits unrelated defaults for getOrDefault(Object, V) from types org.eclipse.collections.api.map.MapIterable and java.util.Map
. This I thought was cool, because at compile time, the Java compiler is ensuring that if there is an API with default implementation in more than one interface in a multi-interface scenario, then Java will not decide which implementation to pick but rather throw compiler errors. Hence, Java ensures at compile time that there is no ambiguity regarding which implementation will be used at runtime. How awesome is that?!? In order to fix the compile time errors, I had to add a default implementations on the interfaces which gave the errors. I always believe in Compiler Errors are better than Runtime Exceptions.
Stuart Marks has put together an awesome blog which covers the specifics of such scenarios. I suggest reading that for in-depth understanding of how and why this behavior is observed.
Post Eclipse Collections 10.3.0 the below code samples will work:
Eclipse Collections 10.3.0 was released on 08/08/2020 and is one of our most feature packed releases. The release constitutes numerous contributions from the Java community.
I am a Project Lead and Committer for the Eclipse Collections OSS project at the Eclipse Foundation. Eclipse Collections is open for contributions.
Show your support star us on GitHub.