This is an automated email from the ASF dual-hosted git repository.
git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/groovy-dev-site.git
The following commit(s) were added to refs/heads/asf-site by this push:
new 39f6aed 2025/12/01 08:53:38: Generated dev website from
groovy-website@480e04f
39f6aed is described below
commit 39f6aed5b12e5a3bbf849025e5e7be5fc6d6f59b
Author: jenkins <[email protected]>
AuthorDate: Mon Dec 1 08:53:38 2025 +0000
2025/12/01 08:53:38: Generated dev website from groovy-website@480e04f
---
blog/adventures-with-groovyfx.html | 2 +-
blog/deck-of-cards-with-groovy.html | 2 +-
blog/deep-learning-and-eclipse-collections.html | 2 +-
blog/feed.atom | 13 +-
blog/fruity-eclipse-collections.html | 2 +-
blog/fruity-eclipse-grouping.html | 369 ++++++++++++++++++++++++
blog/groovy-haiku-processing.html | 2 +-
blog/groovy-list-processing-cheat-sheet.html | 2 +-
blog/groovy-lucene.html | 2 +-
blog/groovy-null-processing.html | 2 +-
blog/helloworldemoji.html | 2 +-
blog/index.html | 4 +-
blog/lego-bricks-with-groovy.html | 2 +-
blog/seasons-greetings-emoji.html | 2 +-
blog/set-operations-with-groovy.html | 2 +-
blog/wordle-checker.html | 2 +-
blog/zipping-collections-with-groovy.html | 2 +-
17 files changed, 397 insertions(+), 17 deletions(-)
diff --git a/blog/adventures-with-groovyfx.html
b/blog/adventures-with-groovyfx.html
index 0edce80..3620ecc 100644
--- a/blog/adventures-with-groovyfx.html
+++ b/blog/adventures-with-groovyfx.html
@@ -59,7 +59,7 @@
</ul>
</div>
</div>
- </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Adventures with GroovyFX</a></li><li><a
href='#_further_information' class='anchor-link'>Further
information</a></li></ul><br/><ul class='nav-sidebar'><li style='padding:
0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a
href='./reading-and-writ [...]
+ </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Adventures with GroovyFX</a></li><li><a
href='#_further_information' class='anchor-link'>Further
information</a></li></ul><br/><ul class='nav-sidebar'><li style='padding:
0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a
href='./fruity-eclipse-g [...]
<div class="sectionbody">
<div class="paragraph">
<p>This blog looks at a <a href="http://groovyfx.org/">GroovyFX</a> version of
a <a
href="https://donraab.medium.com/my-weird-and-wonderful-first-adventures-with-javafx-6efe3b1923c8">ToDo
application originally written in JavaFX</a>.
diff --git a/blog/deck-of-cards-with-groovy.html
b/blog/deck-of-cards-with-groovy.html
index e7e043d..6670e67 100644
--- a/blog/deck-of-cards-with-groovy.html
+++ b/blog/deck-of-cards-with-groovy.html
@@ -59,7 +59,7 @@
</ul>
</div>
</div>
- </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Deck of cards with Groovy™, JDK collections and Eclipse
Collections</a></li></ul><br/><ul class='nav-sidebar'><li style='padding:
0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a
href='./deep-learning-and-eclipse-collections'>Deep Learnin [...]
+ </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Deck of cards with Groovy™, JDK collections and Eclipse
Collections</a></li></ul><br/><ul class='nav-sidebar'><li style='padding:
0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a
href='./deep-learning-and-eclipse-collections'>Deep Learnin [...]
<p>Once again, <a href="https://twitter.com/TheDonRaab">Donald Raab</a> has
produced an interesting
<a
href="https://donraab.medium.com/how-to-create-a-deck-of-cards-using-eclipse-collections-d9838ac430b7">blog
post</a> on
<a href="https://github.com/eclipse/eclipse-collections">Eclipse
Collections</a> this one shows some code for modelling and manipulating cards
with Java 17 and Eclipse Collections. His related katas are highly recommended.
diff --git a/blog/deep-learning-and-eclipse-collections.html
b/blog/deep-learning-and-eclipse-collections.html
index 8668b42..3e76125 100644
--- a/blog/deep-learning-and-eclipse-collections.html
+++ b/blog/deep-learning-and-eclipse-collections.html
@@ -59,7 +59,7 @@
</ul>
</div>
</div>
- </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Deep Learning and Eclipse Collections</a></li><li><a
href='#_setting_up_our_model_and_data' class='anchor-link'>Setting up our model
and data</a></li><li><a href='#_applying_deep_learning'
class='anchor-link'>Applying deep learning</a></li></ul><br/><ul
class='nav-sidebar' [...]
+ </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Deep Learning and Eclipse Collections</a></li><li><a
href='#_setting_up_our_model_and_data' class='anchor-link'>Setting up our model
and data</a></li><li><a href='#_applying_deep_learning'
class='anchor-link'>Applying deep learning</a></li></ul><br/><ul
class='nav-sidebar' [...]
<div class="sectionbody">
<div class="paragraph">
<p>In previous blogs, we’ve covered
diff --git a/blog/feed.atom b/blog/feed.atom
index a7f025f..1bc306f 100644
--- a/blog/feed.atom
+++ b/blog/feed.atom
@@ -4,7 +4,18 @@
<link href="http://groovy.apache.org/blog"/>
<link href="http://groovy.apache.org/blog/feed.atom" rel="self"/>
<id>http://groovy.apache.org/blog</id>
- <updated>2025-11-14T20:05:00Z</updated>
+ <updated>2025-12-01T10:45:00Z</updated>
+ <entry>
+ <id>http://groovy.apache.org/blog/fruity-eclipse-grouping</id>
+ <author>
+ <name>Paul King</name>
+ </author>
+ <title type="html">Grouping Fruity Collections</title>
+ <link href="http://groovy.apache.org/blog/fruity-eclipse-grouping"/>
+ <updated>2025-12-01T10:45:00Z</updated>
+ <published>2025-12-01T10:45:00Z</published>
+ <summary type="html">This post looks at using grouping in the context of
many-to-many relationships.</summary>
+ </entry>
<entry>
<id>http://groovy.apache.org/blog/embabel-agentic-patterns</id>
<author>
diff --git a/blog/fruity-eclipse-collections.html
b/blog/fruity-eclipse-collections.html
index a3c27e3..09f17b2 100644
--- a/blog/fruity-eclipse-collections.html
+++ b/blog/fruity-eclipse-collections.html
@@ -59,7 +59,7 @@
</ul>
</div>
</div>
- </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Fruity Eclipse Collections</a></li><li><a
href='#_eclipse_collections_fruit_salad' class='anchor-link'>Eclipse
Collections Fruit Salad</a></li><li><a href='#_exploring_emoji_colors'
class='anchor-link'>Exploring emoji colors</a></li><li><a
href='#_putting_it_all_together' [...]
+ </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Fruity Eclipse Collections</a></li><li><a
href='#_eclipse_collections_fruit_salad' class='anchor-link'>Eclipse
Collections Fruit Salad</a></li><li><a href='#_exploring_emoji_colors'
class='anchor-link'>Exploring emoji colors</a></li><li><a
href='#_putting_it_all_together' [...]
<div class="sectionbody">
<div class="paragraph">
<p>This blog post continues on the theme of using fruit emoji from the
diff --git a/blog/fruity-eclipse-grouping.html
b/blog/fruity-eclipse-grouping.html
new file mode 100644
index 0000000..f446247
--- /dev/null
+++ b/blog/fruity-eclipse-grouping.html
@@ -0,0 +1,369 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+ <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible'
content='IE=edge'/><meta name='viewport' content='width=device-width,
initial-scale=1'/><meta name='keywords' content='eclipse collections, groovy,
emoji, many-to-many, grouping'/><meta name='description' content='This post
looks at using grouping in the context of many-to-many
relationships.'/><title>The Apache Groovy programming language - Blogs -
Grouping Fruity Collections</title><link href='../img/favicon.ico' type='image
[...]
+</head><body>
+ <div id='fork-me'>
+ <a href='https://github.com/apache/groovy'>
+ <img style='position: fixed; top: 20px; right: -58px; border: 0;
z-index: 100; transform: rotate(45deg);'
src='../img/horizontal-github-ribbon.png'/>
+ </a>
+ </div><div id='st-container' class='st-container st-effect-9'>
+ <nav class='st-menu st-effect-9' id='menu-12'>
+ <h2 class='icon icon-lab'>Socialize</h2><ul>
+ <li>
+ <a href='https://groovy-lang.org/mailing-lists.html'
class='icon'><span class='fa fa-classic fa-regular fa-envelope'></span> Discuss
on the mailing list</a>
+ </li><li>
+ <a href='https://x.com/ApacheGroovy' class='icon'><span
class='fa fa-brands fa-x-twitter'></span> Groovy on X</a>
+ </li><li>
+ <a href='https://bsky.app/profile/groovy.apache.org'
class='icon'><span class='fa fa-brands fa-bluesky'></span> Groovy on Bluesky</a>
+ </li><li>
+ <a href='https://fosstodon.org/@ApacheGroovy'
class='icon'><span class='fa fa-brands fa-mastodon'></span> Groovy on
Mastodon</a>
+ </li><li>
+ <a
href='https://www.linkedin.com/company/106402668/admin/dashboard/'
class='icon'><span class='fa fa-brands fa-linkedin'></span> Groovy on
LinkedIn</a>
+ </li><li>
+ <a href='https://groovy-lang.org/events.html'
class='icon'><span class='fa fa-classic fa-solid fa-calendar-days'></span>
Events and conferences</a>
+ </li><li>
+ <a href='https://github.com/apache/groovy'
class='icon'><span class='fa fa-brands fa-github'></span> Source code on
GitHub</a>
+ </li><li>
+ <a href='https://groovy-lang.org/reporting-issues.html'
class='icon'><span class='fa fa-classic fa-solid fa-bug'></span> Report issues
in Jira</a>
+ </li><li>
+ <a href='http://stackoverflow.com/questions/tagged/groovy'
class='icon'><span class='fa fa-brands fa-stack-overflow'></span> Stack
Overflow questions</a>
+ </li><li>
+ <a href='http://www.groovycommunity.com/'
class='icon'><span class='fa fa-brands fa-slack'></span> Slack Community</a>
+ </li>
+ </ul>
+ </nav><div class='st-pusher'>
+ <div class='st-content'>
+ <div class='st-content-inner'>
+ <!--[if lt IE 7]>
+ <p class="browsehappy">You are using an
<strong>outdated</strong> browser. Please <a
href="http://browsehappy.com/">upgrade your browser</a> to improve your
experience.</p>
+ <![endif]--><div><div class='navbar navbar-default
navbar-static-top' role='navigation'>
+ <div class='container'>
+ <div class='navbar-header'>
+ <button type='button'
class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+ <span class='sr-only'></span><span
class='icon-bar'></span><span class='icon-bar'></span><span
class='icon-bar'></span>
+ </button><a class='navbar-brand'
href='../index.html'>
+ <i class='fa-classic fa-solid
fa-star'></i> Apache Groovy™
+ </a>
+ </div><div class='navbar-collapse collapse'>
+ <ul class='nav navbar-nav navbar-right'>
+ <li class=''><a
href='https://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a
href='https://groovy-lang.org/documentation.html'>Documentation</a></li><li
class=''><a href='/download.html'>Download</a></li><li class=''><a
href='https://groovy-lang.org/support.html'>Support</a></li><li class=''><a
href='/'>Contribute</a></li><li class=''><a
href='https://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li class=''><a
href='/blog'>Blog pos [...]
+ <a data-effect='st-effect-9'
class='st-trigger' href='#'>Socialize</a>
+ </li><li class=''>
+ <a href='../search.html'>
+ <i class='fa-classic fa-solid
fa-magnifying-glass'></i>
+ </a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Grouping Fruity Collections</a></li><li><a
href='#_grouping_eclipse_collections_fruit_salad' class='anchor-link'>Grouping
Eclipse Collections Fruit Salad</a></li><li><a
href='#_grouping_jdk_collections_fruit_salad' class='anchor-link'>Grouping JDK
Collections Fruit Salad</ [...]
+<div class="sectionbody">
+<div class="paragraph">
+<p>Two previous blog posts have been inspired by the use of emojis in
combination
+with collections of fruit or pets as per a related <a
href="https://github.com/eclipse/eclipse-collections-kata/tree/master/top-methods-kata-solutions">Eclipse
Collections kata</a>.
+Those posts had a bit of fun
+<a
href="https://groovy.apache.org/blog/deep-learning-and-eclipse-collections">using
deep learning</a>,
+and <a
href="https://groovy.apache.org/blog/fruity-eclipse-collections">clustering
using k-means</a>
+to do image recognition and color guessing based on emojis.</p>
+</div>
+<div class="paragraph">
+<p>This post doesn’t look at machine learning topics, but instead looks
at
+what might seem like a more mundane task, but one that is very common:
grouping.
+Grouping occurs naturally in any datasets where relationships exist.</p>
+</div>
+<div class="paragraph">
+<p>The <code>groupBy</code> method does the job perfectly for one-to-many
relationships.
+It appears as one of the "top 25" methods in the previously mentioned Eclipse
Collections kata,
+and is one of the examples carried over into the aforementioned Groovy blog
posts:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">assert
Fruit.ALL.groupBy(Fruit::getColor) ==
+ Multimaps.mutable.list.empty()
+ .withKeyMultiValues(RED, Fruit.of('🍎'), Fruit.of('🍒'))
+ .withKeyMultiValues(ORANGE, Fruit.of('🍑'), Fruit.of('🍊'))
+ .withKeyMultiValues(YELLOW, Fruit.of('🍌'))
+ .withKeyMultiValues(MAGENTA, Fruit.of('🍇'))</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We have a collection of fruit and we have colors.
+The fruit is an enum. The colors are <code>java.awt.Color</code> values.
+We won’t show the details of those but see the previous blog posts or the
+associated GitHub repo if you want all the details.</p>
+</div>
+<div class="paragraph">
+<p>As originally presented,
+there is a one-to-many relationship between fruit and their color.
+A fruit has one color, but there can be many fruit of a particular color.
+That’s what <code>groupBy</code> allows us to explore.</p>
+</div>
+<div class="paragraph">
+<p>In this post, we want to explore grouping in the context of many-to-many
relationships.</p>
+</div>
+<div class="paragraph">
+<p>As an example, suppose now that rather than just coming in one
<em>typical</em> color,
+in our case the predominant color of the supplied emoji, that multiple colors
might be possible for
+any given fruit: red and green apples, a green unripe banana, and so forth.
+So, let’s expand the previous example so that rather than calling
<code>getColor</code> to find <em>the</em> color,
+we’ll call <code>getColors</code> to find a list of potential colors.</p>
+</div>
+<div class="paragraph">
+<p>We’ll do that first using Eclipse Collections and then look at
various possibilities
+for JDK collections when using Groovy.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_grouping_eclipse_collections_fruit_salad">Grouping Eclipse
Collections Fruit Salad</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>We saw earlier that we could do some grouping using the
<code>groupBy</code> method offered
+by Eclipse collection classes implementing the <code>RichIterable</code>
interface.
+In fact, if we combine <code>groupBy</code> with some other methods like
<code>flatCollect</code> (<em>flatMap</em>) or the inject
+family of methods, we’d be able to represent the many fruit to many
color relationship that we now
+want to explore. However, the <code>groupByEach</code> method combines several
steps into just one
+and that’s what we’ll use here.</p>
+</div>
+<div class="paragraph">
+<p>The <code>groupByEach</code> method didn’t make the cut of being in
the "top 25" methods in the Eclipse
+Collections kata but is exactly what we need for a many-to-many relationship
+(many fruit and many potential colors).</p>
+</div>
+<div class="paragraph">
+<p>For our example, we’ll add <code>GREEN</code> as a possible color for
apples, bananas (unripe), and grapes.
+Here is how we can explore the relationship between fruit and colors with
these additions:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">assert
Fruit.ALL.groupByEach(Fruit::getColors) ==
+ Multimaps.mutable.list.empty()
+ .withKeyMultiValues(GREEN, Fruit.of('🍎'), Fruit.of('🍌'),
Fruit.of('🍇'))
+ .withKeyMultiValues(RED, Fruit.of('🍎'), Fruit.of('🍒'))
+ .withKeyMultiValues(ORANGE, Fruit.of('🍑'), Fruit.of('🍊'))
+ .withKeyMultiValues(YELLOW, Fruit.of('🍌'))
+ .withKeyMultiValues(MAGENTA, Fruit.of('🍇'))</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Grape colors are sometimes known by the juice or wine they produce (red and
white)
+and sometimes by their skin color, green and purple or magenta. We’ll
stick with the
+latter for the purposes of this post.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_grouping_jdk_collections_fruit_salad">Grouping JDK Collections Fruit
Salad</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>If we want to achieve the same thing for JDK collections, we have a few
options.
+We could consider stream functionality but, like with Eclipse Collections,
there
+are ways to achieve what we want building on the fairly widely known
<code>groupBy</code>
+functionality offered by Groovy. We’ll explore that next, but first
let’s
+look at our expected result. It will be similar to what we had for Eclipse
+Collections but just using normal JDK lists and maps:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">var expected = [
+ (GREEN) : [Fruit.of('🍎'), Fruit.of('🍌'), Fruit.of('🍇')],
+ (RED) : [Fruit.of('🍎'), Fruit.of('🍒')],
+ (ORANGE) : [Fruit.of('🍑'), Fruit.of('🍊')],
+ (YELLOW) : [Fruit.of('🍌')],
+ (MAGENTA) : [Fruit.of('🍇')]
+]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Note that Groovy defaults to keys being String values in its literal map
notation,
+so we use round brackets around key values so that Groovy will use keys with
<code>java.awt.Color</code>
+values like we have been using in earlier examples.</p>
+</div>
+<div class="paragraph">
+<p>Now, we can find fruits by color <em>simply</em> by using
<code>groupBy</code>
+in combination with <code>collectMany</code> (<em>flatMap</em>) and
<code>collectEntries</code> (or we could use <code>inject</code>):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">assert expected ==
Fruit.values()
+ .collectMany(f -> f.colors.collect{ c -> [c, f] })
+ .groupBy{ c, f -> c }
+ .collectEntries{ k, v -> [k, v*.get(1)] }</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This works well but isn’t necessarily obvious at first glance.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_grouping_jdk_collections_fruit_salad_with_gquery">Grouping JDK
Collections Fruit Salad with GQuery</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Dealing with many-to-many relationships is very common in database systems.
+Query languages like SQL have special support for querying such relationships.
+It should come as no surprise then, that Groovy’s integrated query
technology,
+GQuery (groovy-ginq), would also support such relationships.</p>
+</div>
+<div class="paragraph">
+<p>Here is the same example again using GQuery:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">assert expected ==
GQL {
+ from f in Fruit.values()
+ crossjoin c in Fruit.values()*.colors.sum().toSet()
+ where c in f.colors
+ groupby c
+ select c, list(f)
+}.collectEntries()</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>crossjoin</code> gives us the cross-product and the
<code>where</code> and <code>groupby</code> clauses
+select the desired elements. The <code>collectEntries</code> at the end
converts from GQuery’s
+tabular format to the map used for our expectation.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_grouping_jdk_collections_fruit_salad_in_groovy_6">Grouping JDK
Collections Fruit Salad in Groovy 6</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Inspired by the <code>groupByEach</code> method from
+<a href="https://www.eclipse.org/collections/">Eclipse Collections</a> and the
examples in the
+<a
href="https://www.amazon.com/Eclipse-Collections-Categorically-Level-programming/dp/B0DZVK69D3">Eclipse
Collections Categorically book</a>,
+the Groovy team has recently added a <code>groupByMany</code> method. This is
in Groovy 6
+which is still in the alpha/snapshot stage of evolution, so is subject to
change.</p>
+</div>
+<div class="paragraph">
+<p>Using <code>groupByMany</code> our example becomes:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">assert expected ==
Fruit.values().groupByMany(Fruit::getColors)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>That was easy! And that’s the appeal of adding this method to
Groovy.</p>
+</div>
+<div class="paragraph">
+<p>Let’s look at some other variations. One variant takes a second
closure which
+allows the value to be transformed (mapped). In our case, we’ll just get
the emoji
+representation for our fruit rather than the enum used in previous
examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">assert
Fruit.values().groupByMany(Fruit::getEmoji, Fruit::getColors) == [
+ (GREEN) : ['🍎', '🍌', '🍇'],
+ (RED) : ['🍎', '🍒'],
+ (ORANGE) : ['🍑', '🍊'],
+ (YELLOW) : ['🍌'],
+ (MAGENTA) : ['🍇']
+]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In more typical cases, you might have domain classes and mapping from some
+domain, e.g. <code>Person</code> to some desired value, e.g. a String
<code>name</code> for the person.</p>
+</div>
+<div class="paragraph">
+<p>As another example, let’s group the fruit by the vowels they
contain:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">var vowels =
'AEIOU'.toSet()
+var vowelsOf = { String word -> word.toSet().intersect(vowels) }
+assert Fruit.values().groupByMany(Fruit::getEmoji, fruit ->
vowelsOf(fruit.name())) == [
+ A: ['🍎', '🍑', '🍌', '🍊', '🍇'],
+ E: ['🍎', '🍑', '🍒', '🍊', '🍇'],
+ O: ['🍊']
+]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Our <code>ORANGE</code> fruit makes all three lists. <code>BANANA</code>
and <code>CHERRY</code> are just
+in one list. The other fruit all have both <code>A</code> and
<code>E</code>.</p>
+</div>
+<div class="paragraph">
+<p>There is also a variant of <code>groupByMany</code> taking no parameters.
+It caters for Maps where the value is already a list of the appropriate keys.
+As an example, suppose we want to buy fruit locally.
+I’ll roughly base this on subtropical Brisbane, but you could modify as
appropriate
+if you are interested.
+We might now be interested in knowing when seasonal fruit will be
available:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">var availability =
[
+ '🍎': ['Spring'],
+ '🍌': ['Spring', 'Summer', 'Autumn', 'Winter'],
+ '🍇': ['Spring', 'Autumn'],
+ '🍒': ['Autumn'],
+ '🍑': ['Spring']
+]
+
+assert availability.groupByMany() == [
+ Winter: ['🍌'],
+ Autumn: ['🍌', '🍇', '🍒'],
+ Summer: ['🍌'],
+ Spring: ['🍎', '🍌', '🍇', '🍑']
+]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>[Sorry U.S. folks, <em>Autumn</em> has the same number of letters as the
other season names
+and makes the last map look prettier - <em>Fall</em> just didn’t cut it
this time!]</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_further_information">Further information</h2>
+<div class="sectionbody">
+<div class="ulist">
+<ul>
+<li>
+<p>Repo with example code: <a
href="https://github.com/paulk-asert/fruity-eclipse-collections"
class="bare">https://github.com/paulk-asert/fruity-eclipse-collections</a></p>
+</li>
+<li>
+<p>Eclipse collections homepage: <a
href="https://www.eclipse.org/collections/"
class="bare">https://www.eclipse.org/collections/</a></p>
+</li>
+<li>
+<p>Eclipse Collections Categorically: <a
href="https://www.amazon.com/Eclipse-Collections-Categorically-Level-programming/dp/B0DZVK69D3"
class="bare">https://www.amazon.com/Eclipse-Collections-Categorically-Level-programming/dp/B0DZVK69D3</a></p>
+</li>
+</ul>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+ <div class='row'>
+ <div class='colset-3-footer'>
+ <div class='col-1'>
+ <h1>Groovy</h1><ul>
+ <li><a
href='https://groovy-lang.org/learn.html'>Learn</a></li><li><a
href='https://groovy-lang.org/documentation.html'>Documentation</a></li><li><a
href='/download.html'>Download</a></li><li><a
href='https://groovy-lang.org/support.html'>Support</a></li><li><a
href='/'>Contribute</a></li><li><a
href='https://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li><a
href='/blog'>Blog posts</a></li><li><a
href='https://groovy.apache.org/events.ht [...]
+ </ul>
+ </div><div class='col-2'>
+ <h1>About</h1><ul>
+ <li><a
href='https://github.com/apache/groovy'>Source code</a></li><li><a
href='https://groovy-lang.org/security.html'>Security</a></li><li><a
href='https://groovy-lang.org/learn.html#books'>Books</a></li><li><a
href='https://groovy-lang.org/thanks.html'>Thanks</a></li><li><a
href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a
href='https://groovy-lang.org/faq.html'>FAQ</a></li><li><a
href='https://groovy-lang.or [...]
+ </ul>
+ </div><div class='col-3'>
+ <h1>Socialize</h1><ul>
+ <li><a
href='https://groovy-lang.org/mailing-lists.html'>Discuss on the mailing
list</a></li><li><a href='https://x.com/ApacheGroovy'>Groovy on
X</a></li><li><a href='https://bsky.app/profile/groovy.apache.org'>Groovy on
Bluesky</a></li><li><a href='https://fosstodon.org/@ApacheGroovy'>Groovy on
Mastodon</a></li><li><a
href='https://www.linkedin.com/company/106402668/admin/dashboard/'>Groovy on
LinkedIn</a></li><li><a href='https://groovy-lang. [...]
+ </ul>
+ </div><div class='col-right'>
+ <p>
+ The Groovy programming language is
supported by the <a href='https://www.apache.org'>Apache Software
Foundation</a> and the Groovy community.
+ </p><div text-align='right'>
+ <img
src='https://www.apache.org/img/asf_logo.png' title='The Apache Software
Foundation' alt='The Apache Software Foundation' style='width:60%'/>
+ </div><p>Apache, Apache Groovy,
Groovy, and the ASF logo are either registered trademarks or trademarks of The
Apache Software Foundation.</p>
+ </div>
+ </div><div class='clearfix'>© 2003-2025
the Apache Groovy project — Groovy is Open Source: <a
href='https://www.apache.org/licenses/LICENSE-2.0.html' alt='Apache 2
License'>license</a>, <a
href='https://privacy.apache.org/policies/privacy-policy-public.html'>privacy
policy</a>.</div>
+ </div>
+ </footer></div>
+ </div>
+ </div>
+ </div>
+ </div><script src='../js/vendor/jquery-1.10.2.min.js'
defer></script><script src='../js/vendor/classie.js' defer></script><script
src='../js/vendor/bootstrap.js' defer></script><script
src='../js/vendor/sidebarEffects.js' defer></script><script
src='../js/vendor/modernizr-2.6.2.min.js' defer></script><script
src='../js/plugins.js' defer></script><script
src='../js/vendor/prettify.min.js'></script><script>document.addEventListener('DOMContentLoaded',prettyPrint)</script>
+</body></html>
\ No newline at end of file
diff --git a/blog/groovy-haiku-processing.html
b/blog/groovy-haiku-processing.html
index cb84ddd..c5e3e3d 100644
--- a/blog/groovy-haiku-processing.html
+++ b/blog/groovy-haiku-processing.html
@@ -59,7 +59,7 @@
</ul>
</div>
</div>
- </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Groovy™ Haiku processing</a></li><li><a
href='#_example_1_finding_the_distinct_letters' class='anchor-link'>Example 1:
Finding the distinct letters</a></li><li><a
href='#_example_2_splitting_letters_into_unique_and_duplicate_partitions'
class='anchor-link'>Example 2: [...]
+ </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Groovy™ Haiku processing</a></li><li><a
href='#_example_1_finding_the_distinct_letters' class='anchor-link'>Example 1:
Finding the distinct letters</a></li><li><a
href='#_example_2_splitting_letters_into_unique_and_duplicate_partitions'
class='anchor-link'>Example 2: [...]
<div class="sectionbody">
<div class="paragraph">
<p>This blog looks at some Groovy solutions for the examples in the
diff --git a/blog/groovy-list-processing-cheat-sheet.html
b/blog/groovy-list-processing-cheat-sheet.html
index a620a9b..e48605b 100644
--- a/blog/groovy-list-processing-cheat-sheet.html
+++ b/blog/groovy-list-processing-cheat-sheet.html
@@ -59,7 +59,7 @@
</ul>
</div>
</div>
- </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Groovy™ List Processing Cheat Sheet</a></li><li><a
href='#_declaring_lists' class='anchor-link'>Declaring lists</a></li><li><a
href='#_list_elements_and_properties' class='anchor-link'>List elements and
properties</a></li><li><a href='#_modifying_mutable_lists' class [...]
+ </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Groovy™ List Processing Cheat Sheet</a></li><li><a
href='#_declaring_lists' class='anchor-link'>Declaring lists</a></li><li><a
href='#_list_elements_and_properties' class='anchor-link'>List elements and
properties</a></li><li><a href='#_modifying_mutable_lists' class [...]
<h2 id="_declaring_lists">Declaring lists</h2>
<div class="sectionbody">
<div class="paragraph">
diff --git a/blog/groovy-lucene.html b/blog/groovy-lucene.html
index cc9218c..1e7ea43 100644
--- a/blog/groovy-lucene.html
+++ b/blog/groovy-lucene.html
@@ -59,7 +59,7 @@
</ul>
</div>
</div>
- </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Searching with Lucene</a></li><li><a
href='#_a_regular_expression_for_project_names' class='anchor-link'>A regular
expression for project names</a></li><li><a
href='#_collecting_project_name_statistics_using_regex_matching'
class='anchor-link'>Collecting project name stati [...]
+ </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Searching with Lucene</a></li><li><a
href='#_a_regular_expression_for_project_names' class='anchor-link'>A regular
expression for project names</a></li><li><a
href='#_collecting_project_name_statistics_using_regex_matching'
class='anchor-link'>Collecting project name stati [...]
<a href="https://github.com/paulk-asert/" target="_blank" rel="noopener
noreferrer"><img style="border-radius:50%;height:48px;width:auto"
src="img/paulk-asert.png" alt="Paul King"></a>
<div style="display:grid;align-items:center;margin:0.1ex;padding:0ex">
<div><a href="https://github.com/paulk-asert/" target="_blank" rel="noopener
noreferrer"><span>Paul King</span></a></div>
diff --git a/blog/groovy-null-processing.html b/blog/groovy-null-processing.html
index 5a18de8..4f3d25b 100644
--- a/blog/groovy-null-processing.html
+++ b/blog/groovy-null-processing.html
@@ -59,7 +59,7 @@
</ul>
</div>
</div>
- </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Groovy™ Processing Nulls In Lists</a></li><li><a
href='#_libraries_covered' class='anchor-link'>Libraries covered</a></li><li><a
href='#_mutating_a_list_to_remove_its_nulls' class='anchor-link'>Mutating a
list to remove its nulls</a></li><li><a href='#_producing_a_ne [...]
+ </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Groovy™ Processing Nulls In Lists</a></li><li><a
href='#_libraries_covered' class='anchor-link'>Libraries covered</a></li><li><a
href='#_mutating_a_list_to_remove_its_nulls' class='anchor-link'>Mutating a
list to remove its nulls</a></li><li><a href='#_producing_a_ne [...]
<div class="sectionbody">
<div class="paragraph">
<p>This <a
href="https://www.programmergirl.com/java-remove-nulls-from-list/">article</a>
by <a href="https://www.programmergirl.com/about-me/">Shubhra Srivastava</a>
diff --git a/blog/helloworldemoji.html b/blog/helloworldemoji.html
index f787eed..b2c995f 100644
--- a/blog/helloworldemoji.html
+++ b/blog/helloworldemoji.html
@@ -59,7 +59,7 @@
</ul>
</div>
</div>
- </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Hello World with Emojis</a></li></ul><br/><ul
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color:
#eee'><span>Related posts</span></li><li><a
href='./set-operations-with-groovy'>Set Operators with
Groovy™</a></li><li><a href='./zipping-collectio [...]
+ </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Hello World with Emojis</a></li></ul><br/><ul
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color:
#eee'><span>Related posts</span></li><li><a
href='./fruity-eclipse-grouping'>Grouping Fruity Collections</a></li><li><a
href='./set-operations-with-groov [...]
<p>In a <a
href="https://groovy.apache.org/blog/jvm-hello-world-with-groovy">previous blog
post</a>
we took an in-depth look at how to write a "hello world" class at the bytecode
level
using various libraries.</p>
diff --git a/blog/index.html b/blog/index.html
index 08bd4ee..821da61 100644
--- a/blog/index.html
+++ b/blog/index.html
@@ -59,7 +59,7 @@
</ul>
</div>
</div>
- </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3' id='blog-index'><ul
class='nav-sidebar list'><li class='active'><a
href='/blog/'>Blogs</a></li><li><a href='groovy-ai'>Exploring AI with
Groovy™</a></li><li><a href='embabel-agentic-patterns'>Groovy™,
Embabel, and Agentic Design Patterns</a></li><li><a
href='wayang-tensorflow'>Using TensorFlow from Apache Wayang</a></li><li><a
href='using-groovy-with-ap [...]
+ </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3' id='blog-index'><ul
class='nav-sidebar list'><li class='active'><a
href='/blog/'>Blogs</a></li><li><a href='fruity-eclipse-grouping'>Grouping
Fruity Collections</a></li><li><a href='groovy-ai'>Exploring AI with
Groovy™</a></li><li><a href='embabel-agentic-patterns'>Groovy™,
Embabel, and Agentic Design Patterns</a></li><li><a
href='wayang-tensorflow'>Usi [...]
<div class='row'>
<div class='colset-3-footer'>
<div class='col-1'>
@@ -103,7 +103,7 @@
colors: am5.ColorSet.new(root, {})
}));
wc.data.setAll([
- { category: "groovy", value: 87 }, { category: "asf", value: 2
}, { category: "apachecon", value: 3 }, { category: "communityovercode", value:
2 }, { category: "natural language processing", value: 2 }, { category: "nlp",
value: 1 }, { category: "nlpcraft", value: 1 }, { category: "combinations",
value: 1 }, { category: "permutations", value: 1 }, { category: "testing",
value: 2 }, { category: "junit", value: 2 }, { category: "spock", value: 2 }, {
category: "jqwik", valu [...]
+ { category: "groovy", value: 88 }, { category: "asf", value: 2
}, { category: "apachecon", value: 3 }, { category: "communityovercode", value:
2 }, { category: "natural language processing", value: 2 }, { category: "nlp",
value: 1 }, { category: "nlpcraft", value: 1 }, { category: "combinations",
value: 1 }, { category: "permutations", value: 1 }, { category: "testing",
value: 2 }, { category: "junit", value: 2 }, { category: "spock", value: 2 }, {
category: "jqwik", valu [...]
]);
wc.labels.template.setAll({
paddingTop: 5,
diff --git a/blog/lego-bricks-with-groovy.html
b/blog/lego-bricks-with-groovy.html
index 0b670db..fcf874f 100644
--- a/blog/lego-bricks-with-groovy.html
+++ b/blog/lego-bricks-with-groovy.html
@@ -59,7 +59,7 @@
</ul>
</div>
</div>
- </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Lego Bricks with Groovy™</a></li><li><a
href='#_basic_collection_processing' class='anchor-link'>Basic Collection
Processing</a></li><li><a href='#_our_example_domain' class='anchor-link'>Our
example domain</a></li><li><a href='#_some_bricks_to_play_with' class='anch
[...]
+ </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Lego Bricks with Groovy™</a></li><li><a
href='#_basic_collection_processing' class='anchor-link'>Basic Collection
Processing</a></li><li><a href='#_our_example_domain' class='anchor-link'>Our
example domain</a></li><li><a href='#_some_bricks_to_play_with' class='anch
[...]
<div class="sectionbody">
<div class="paragraph">
<p><a href="https://twitter.com/TheDonRaab">Donald Raab</a> has continued has
interesting
diff --git a/blog/seasons-greetings-emoji.html
b/blog/seasons-greetings-emoji.html
index d6dead4..80244c8 100644
--- a/blog/seasons-greetings-emoji.html
+++ b/blog/seasons-greetings-emoji.html
@@ -59,7 +59,7 @@
</ul>
</div>
</div>
- </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Season’s Greetings with Emojis</a></li><li><a
href='#_jdk_21_new_features' class='anchor-link'>JDK 21 New
Features</a></li><li><a href='#_playing_with_emojis_with_groovy'
class='anchor-link'>Playing with Emojis with Groovy</a></li><li><a
href='#_more_information' cla [...]
+ </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Season’s Greetings with Emojis</a></li><li><a
href='#_jdk_21_new_features' class='anchor-link'>JDK 21 New
Features</a></li><li><a href='#_playing_with_emojis_with_groovy'
class='anchor-link'>Playing with Emojis with Groovy</a></li><li><a
href='#_more_information' cla [...]
<div class="sectionbody">
<div class="paragraph">
<p>In a <a href="https://groovy.apache.org/blog/helloworldemoji">previous blog
post</a>
diff --git a/blog/set-operations-with-groovy.html
b/blog/set-operations-with-groovy.html
index 70515f5..ea0e209 100644
--- a/blog/set-operations-with-groovy.html
+++ b/blog/set-operations-with-groovy.html
@@ -59,7 +59,7 @@
</ul>
</div>
</div>
- </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Set Operators with Groovy™</a></li></ul><br/><ul
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color:
#eee'><span>Related posts</span></li><li><a
href='./zipping-collections-with-groovy'>Zipping Collections with
Groovy™</a></li><li><a href= [...]
+ </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Set Operators with Groovy™</a></li></ul><br/><ul
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color:
#eee'><span>Related posts</span></li><li><a
href='./fruity-eclipse-grouping'>Grouping Fruity Collections</a></li><li><a
href='./zipping-collecti [...]
<p><a href="https://twitter.com/TheDonRaab">Donald Raab</a> posted <a
href="https://donraab.medium.com/comparing-set-operations-between-java-and-eclipse-collections-92cf1df28d3b">an
article</a> about set operators using Java collections and <a
href="https://github.com/eclipse/eclipse-collections">Eclipse Collections</a>.
<a
href="https://donraab.medium.com/comparing-set-operations-between-java-and-eclipse-collections-92cf1df28d3b">That
post</a> focuses
on the <em>union</em>, <em>intersection</em> and <em>difference</em>
operators. We’ll add in
<em>symmetric difference</em> since Groovy supports operator overloading for
that
diff --git a/blog/wordle-checker.html b/blog/wordle-checker.html
index 256d81f..f496245 100644
--- a/blog/wordle-checker.html
+++ b/blog/wordle-checker.html
@@ -59,7 +59,7 @@
</ul>
</div>
</div>
- </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Checking Wordle with Groovy™</a></li></ul><br/><ul
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color:
#eee'><span>Related posts</span></li><li><a
href='./zipping-collections-with-groovy'>Zipping Collections with
Groovy™</a></li><li><a hre [...]
+ </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Checking Wordle with Groovy™</a></li></ul><br/><ul
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color:
#eee'><span>Related posts</span></li><li><a
href='./zipping-collections-with-groovy'>Zipping Collections with
Groovy™</a></li><li><a hre [...]
<p>This <a
href="https://donraab.medium.com/comparing-my-smalltalk-and-eclipse-collections-wordle-kata-solutions-4058ac7d8ca0">article</a>
by <a href="https://twitter.com/TheDonRaab">Donald Raab</a>
looks at writing a Wordle checker in Smalltalk and Java using <a
href="https://github.com/eclipse/eclipse-collections">Eclipse Collections</a>.
Let’s look at doing the same in Groovy.
We could easily use Eclipse Collections with Groovy
diff --git a/blog/zipping-collections-with-groovy.html
b/blog/zipping-collections-with-groovy.html
index 1d18bac..123d4e5 100644
--- a/blog/zipping-collections-with-groovy.html
+++ b/blog/zipping-collections-with-groovy.html
@@ -59,7 +59,7 @@
</ul>
</div>
</div>
- </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Zipping Collections with Groovy™</a></li><li><a
href='#_what_is_zipping' class='anchor-link'>What is zipping?</a></li><li><a
href='#_groovy' class='anchor-link'>Groovy</a></li><li><a
href='#_eclipse_collections' class='anchor-link'>Eclipse
Collections</a></li><li><a [...]
+ </div><div id='content' class='page-1'><div
class='row'><div class='row-fluid'><div class='col-lg-3'><ul
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a
href='#doc'>Zipping Collections with Groovy™</a></li><li><a
href='#_what_is_zipping' class='anchor-link'>What is zipping?</a></li><li><a
href='#_groovy' class='anchor-link'>Groovy</a></li><li><a
href='#_eclipse_collections' class='anchor-link'>Eclipse
Collections</a></li><li><a [...]
<h2 id="_what_is_zipping">What is zipping?</h2>
<div class="sectionbody">
<div class="paragraph">