Eclipse Collections 10.3 Released

Donald Raab
Oracle Developers
Published in
5 min readAug 9, 2020

This is the release we’ve been waiting for.

Mt. Fuji in 2006

Thank you to the community

Eclipse Collections 10.2 was released in February 2020 and was a relatively small bug fix release after the somewhat monumental 10.0 release. I am happy to say that six months later, the 10.3 release has a lot of new features submitted by our outstanding community of contributors.

Thank you so much to all of the contributors who donated their valuable time to making Eclipse Collections more feature rich and even higher quality. Your efforts are very much appreciated.

If you’re thinking about contributing to an open source project but aren’t sure, check out this great blog from one of our community contributors. In the blog Sirisha Pratha explains some of the benefits she has experienced as she has become an active contributor in the OSS community.

We are always looking for new contributors to join the Eclipse Collections community. Please consider contributing to Eclipse Collections if you are looking for a project to get started on your journey.

Recognition

Eclipse Collections received an amazing and humbling honor in a Java Magazine article in June when it was named one of “The 25 Greatest Java Apps Ever Written.”

The credit belongs to the entire Eclipse Collections community. Your hard work and patience contributing to this library is being recognized. Congratulations and thank you to our entire community. Keep up the great work! You all rock!

Loads of new features and several contributor blogs

There are so many features included in Eclipse Collections 10.3, that it is going to take me a bit longer to write good examples leveraging all of them. The good news is that I’ve already gotten some help from the community. Some contributors blogged about the features they added before I started writing this blog.

Dirk Fauth wrote a blog where he evaluated whether there would be any performance and memory improvements including Eclipse Collections in NatTable. He also raised an issue for a missing feature, contributed the feature, and then updated the blog!

I thanked Dirk for both the blog and code contribution, and he said something in response on Twitter that I found very inspirational.

IMHO this is the way OSS works. Use it, like it, write about it. Find an issue, report it, fix it, contribute back.

Well done, and well said! This is exactly the spirit of community that keeps me working happily in open source.

A suggestion for future releases and future bloggers

Feature blogging is something I would love to see more of in the future from contributors. This is a great way to make sure the features you contribute get discovered by other developers. This may in turn encourage developers to upgrade to the latest release. It is also a great way to help build your own personal brand, as I will link to your feature blogs from the release blog. I will also be happy to like and retweet your blog and thank you publicly for the contribution. You are saving me time explaining how the feature you added works in the release blog, so trust me I will be very thankful and happy to help socialize your hard work!

The Feature Summary

Features with blogs shared by contributors

  1. AggregateBy in MapIterable to aggregate on key and value — by Alex Goldberg
  2. FlatCollect into primitive collections — by Alex Goldberg
  3. Implemented Triples — by Brian Vermeer
  4. Support sorting of primitive lists by indirect comparison — by Vladimir Zakharov
  5. Implemented MapIterable.getOrDefault() to allow easy inter-op—by Nikhil Nanivadekar
  6. ContainsBy on RichIterable — by Donald Raab

New Website Translation

Hindi Translation of Eclipse Collections website.

New Functionality

  1. Added withMap() to MutableMap.
  2. Added forEachInBoth to ListIterable with javadoc.
  3. Added new APIs ofOccurrences and withOccurrences, to bag mutable and immutable factories.
  4. Added wrapCopy() to primitive lists to mirror functionality in FastList.
  5. Added singly-linked implementation of immutable stacks.
  6. Added withInitialCapacity() to primitive List and Set factories.
  7. Added toArray() method to primitive iterables which takes an array as a parameter to store the elements of the iterable.
  8. Added default aggregateBy method to RichIterable that takes a target Map.
  9. Implemented Tuples.identicalTwin(), Tuples.identicalTriplet().
  10. Added shuffleThis() operation to primitive lists.
  11. Added fromToExclusive in Interval.
  12. Implemented swap() method on mutable primitive lists.
  13. Implemented subList() on IntInterval.
  14. Introduced pitest mutation testing.
  15. Implemented LongInterval.
  16. Implemented aggregateBy for MapIterable with a variant to aggregate on key and value.
  17. Implemented Null Safe Comparators by Function.

Other Improvements

Documentation Updates

  1. Added badges to README.md for GitHub Actions build.
  2. Added Working with GitHub wiki page.
  3. Added Javadocs for immutableObjectPrimitiveMap, immutablePrimitiveObjectMap, immutablePrimitivePrimitiveMap.
  4. Added Javadocs for mutableObjectPrimitiveMap, mutablePrimitiveObjectMap, mutablePrimitivePrimitiveMap, mutablePrimitiveValuesMap.
  5. Added Javadocs for primitiveObjectMaps, primitivePrimitiveMaps, primitiveValuesMaps, objectPrimitiveMaps.
  6. Improved documentation of Function2, Function3 and MutableCollection#injectIntoWith.
  7. Added README_EXAMPLES.md.
  8. Fixed Gradle dependency settings in website.

Bug Fixes

  1. Fixed size edge case issues in Interval and IntInterval.
  2. Fixed Javadoc warnings, code generation errors.
  3. Fixed inspections, line-wrapping and whitespace violations.
  4. Fixed symmetry issues with factory methods in Multimaps factory.
  5. Added CheckStyle checks for comma-separated lists that are partially wrapped.

Tech Debt Reduction

  1. Optimized removeIf() implementation on BooleanArrayList.
  2. Increased test coverage for reduceIfEmpty on primitive iterables, MapIterable.getIfAbsent*(), MultimapsTest.
  3. Used org.eclipse.collections.api.factory instead of org.eclipse.collections.impl.factory wherever possible.
  4. Made primitive*HashMap.keySet() serializable.
  5. Made sun.misc an optional Import-Package in OSGi metadata.
  6. Moved primitiveSort.stg to impl/utility.
  7. Optimized collect methods for primitive Immutable Singleton Bag, Set and List.
  8. Optimized implementations of aggregateBy in Bags to use forEachWithOccurrences.
  9. Pulled up ListIterable.binarySearch(), OrderedIterable.toStack(), RichIterable.groupByUniqueKey(),aggregateBy() as default methods.
  10. Implemented with(), without(), withAll(), withoutAll() as default methods.
  11. Refactored PersonAndPetKatatTest to use newer APIs.
  12. Removed duplicate forEach overrides.
  13. Created a simple utility to aid in Javadoc creation.
  14. Updated common primitive stack template for BooleanArrayStack code generation.
  15. Used direct formulas to calculate sum(), mean(), and average() on IntInterval.
  16. Memoized size() value on IntInterval and Interval.
  17. Optimized toImmutable() method on FastList and Primitive Lists to avoids creating a redundant array copy.
  18. Added @Override annotations for tap() (and one toString()) implementations.

Thank you

From all the contributors and committers to the entire Eclipse Collections community… thank you for using Eclipse Collections. We hope you enjoy all of the new features and improvements in the 10.3 release.

I am a Project Lead and Committer for the Eclipse Collections OSS project at the Eclipse Foundation. Eclipse Collections is open for contributions. If you like the library, you can let us know by starring it on GitHub.

--

--

Donald Raab
Oracle Developers

Java Champion. Creator of the Eclipse Collections OSS Java library (https://github.com/eclipse/eclipse-collections). Inspired by Smalltalk. Opinions are my own.