You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by gi...@apache.org on 2023/02/07 01:58:15 UTC
[groovy-dev-site] branch asf-site updated: 2023/02/07 01:58:11: Generated dev website from groovy-website@f6e1fb8
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 0e09aeb 2023/02/07 01:58:11: Generated dev website from groovy-website@f6e1fb8
0e09aeb is described below
commit 0e09aeb14664652dcb757ef815f019f1a5401ec9
Author: jenkins <bu...@apache.org>
AuthorDate: Tue Feb 7 01:58:11 2023 +0000
2023/02/07 01:58:11: Generated dev website from groovy-website@f6e1fb8
---
blog/groovy-null-processing.html | 2 +-
blog/img/ZippingCollectionsEC.png | Bin 0 -> 26935 bytes
blog/img/ZippingCollectionsGQ.png | Bin 0 -> 32461 bytes
blog/img/ZippingCollectionsGroovy.png | Bin 0 -> 16973 bytes
blog/img/ZippingCollectionsGuava.png | Bin 0 -> 24840 bytes
blog/img/ZippingCollectionsJool.png | Bin 0 -> 23483 bytes
blog/img/ZippingCollectionsStreamEx.png | Bin 0 -> 24998 bytes
blog/img/ZippingCollectionsVavr.png | Bin 0 -> 23725 bytes
blog/img/fall_emojis.png | Bin 0 -> 51576 bytes
blog/index.html | 6 +-
...g.html => zipping-collections-with-groovy.html} | 221 +++++++--------------
11 files changed, 73 insertions(+), 156 deletions(-)
diff --git a/blog/groovy-null-processing.html b/blog/groovy-null-processing.html
index 1e00b94..3b43a9f 100644
--- a/blog/groovy-null-processing.html
+++ b/blog/groovy-null-processing.html
@@ -3,7 +3,7 @@
<!--[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='groovy, list, collection, guava, eclipse collections, commons collections, apache, null, Groovy truth'/><title>The Apache Groovy programming language - Blogs - Groovy Processing Nulls In Lists</title><link href='../img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='../ [...]
+ <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='groovy, list, collection, guava, eclipse collections, commons collections, apache, null, Groovy truth'/><meta name='description' content='This post looks at processing lists containing nulls in Groovy.'/><title>The Apache Groovy programming language - Blogs - Groovy Processing Nulls In Lists</title><link href= [...]
</head><body>
<div id='fork-me'>
<a href='https://github.com/apache/groovy'>
diff --git a/blog/img/ZippingCollectionsEC.png b/blog/img/ZippingCollectionsEC.png
new file mode 100644
index 0000000..96ed0f1
Binary files /dev/null and b/blog/img/ZippingCollectionsEC.png differ
diff --git a/blog/img/ZippingCollectionsGQ.png b/blog/img/ZippingCollectionsGQ.png
new file mode 100644
index 0000000..f9ac08c
Binary files /dev/null and b/blog/img/ZippingCollectionsGQ.png differ
diff --git a/blog/img/ZippingCollectionsGroovy.png b/blog/img/ZippingCollectionsGroovy.png
new file mode 100644
index 0000000..7b344f0
Binary files /dev/null and b/blog/img/ZippingCollectionsGroovy.png differ
diff --git a/blog/img/ZippingCollectionsGuava.png b/blog/img/ZippingCollectionsGuava.png
new file mode 100644
index 0000000..d01fd99
Binary files /dev/null and b/blog/img/ZippingCollectionsGuava.png differ
diff --git a/blog/img/ZippingCollectionsJool.png b/blog/img/ZippingCollectionsJool.png
new file mode 100644
index 0000000..349b7c0
Binary files /dev/null and b/blog/img/ZippingCollectionsJool.png differ
diff --git a/blog/img/ZippingCollectionsStreamEx.png b/blog/img/ZippingCollectionsStreamEx.png
new file mode 100644
index 0000000..a32abf8
Binary files /dev/null and b/blog/img/ZippingCollectionsStreamEx.png differ
diff --git a/blog/img/ZippingCollectionsVavr.png b/blog/img/ZippingCollectionsVavr.png
new file mode 100644
index 0000000..1360591
Binary files /dev/null and b/blog/img/ZippingCollectionsVavr.png differ
diff --git a/blog/img/fall_emojis.png b/blog/img/fall_emojis.png
new file mode 100644
index 0000000..94bc940
Binary files /dev/null and b/blog/img/fall_emojis.png differ
diff --git a/blog/index.html b/blog/index.html
index a292d25..3952e25 100644
--- a/blog/index.html
+++ b/blog/index.html
@@ -53,7 +53,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-null-processing'>Groovy Processing Nulls In Lists</a></li><li><a href='groundhog-day'>Groundhog Day</a></li><li><a href='fun-with-rating-stars'>Fun with rating stars</a></li><li><a href='apache-groovy-2022-year-in'>Apache Groovy 2022 Year In Review</a> [...]
+ </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-null-processing'>Groovy Processing Nulls In Lists</a></li><li><a href='groundhog-day'>Groundhog Day</a></li><li><a href='fun-with-rating-stars'>Fun with rating stars</a></li><li><a href='apache-groovy-2022-year-in'>Apache Groovy 2022 Year In Review</a> [...]
<div class='row'>
<div class='colset-3-footer'>
<div class='col-1'>
@@ -84,7 +84,7 @@
</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='https://cdnjs.cloudflare.com/ajax/libs/list.js/1.5.0/list.min.js'></script><script>
var blogList = new List('blog-list', {
valueNames: ['name'],
- page: 7,
+ page: 8,
pagination: true
});
var blogIndex = new List('blog-index', {
@@ -97,7 +97,7 @@
colors: am5.ColorSet.new(root, {})
}));
wc.data.setAll([
- { category: "groovy", value: 40 }, { category: "release", value: 23 }, { category: "decryption", value: 1 }, { category: "encryption", value: 1 }, { category: "security", value: 1 }, { category: "bouncy castle", value: 1 }, { category: "machine learning", value: 2 }, { category: "artificial intelligence", value: 1 }, { category: "neural networks", value: 1 }, { category: "tribuo", value: 1 }, { category: "deep netts", value: 1 }, { category: "encog", value: 1 }, { categor [...]
+ { category: "groovy", value: 41 }, { category: "release", value: 23 }, { category: "decryption", value: 1 }, { category: "encryption", value: 1 }, { category: "security", value: 1 }, { category: "bouncy castle", value: 1 }, { category: "machine learning", value: 2 }, { category: "artificial intelligence", value: 1 }, { category: "neural networks", value: 1 }, { category: "tribuo", value: 1 }, { category: "deep netts", value: 1 }, { category: "encog", value: 1 }, { categor [...]
]);
wc.labels.template.setAll({
paddingTop: 5,
diff --git a/blog/groovy-null-processing.html b/blog/zipping-collections-with-groovy.html
similarity index 52%
copy from blog/groovy-null-processing.html
copy to blog/zipping-collections-with-groovy.html
index 1e00b94..65b75e8 100644
--- a/blog/groovy-null-processing.html
+++ b/blog/zipping-collections-with-groovy.html
@@ -3,7 +3,7 @@
<!--[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='groovy, list, collection, guava, eclipse collections, commons collections, apache, null, Groovy truth'/><title>The Apache Groovy programming language - Blogs - Groovy Processing Nulls In Lists</title><link href='../img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='../ [...]
+ <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='groovy, collections, zip, eclipse collections, guava, vavr, streamex, jOOλ, ginq, gquery, emoji'/><meta name='description' content='This post looks at zipping collections.'/><title>The Apache Groovy programming language - Blogs - Zipping Collections with Groovy</title><link href='../img/favicon.ico' type='imag [...]
</head><body>
<div id='fork-me'>
<a href='https://github.com/apache/groovy'>
@@ -53,213 +53,130 @@
</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/'>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_new_l [...]
+ </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/'>Blog index</a></li><li class='active'><a href='#doc'>Zipping Collections with Groovy</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 href='#_guava' class='anchor-link'>Guava</a></li><li><a href='#_streamex' class= [...]
<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>
-looks at processing lists containing nulls in Java. Let’s look at doing the same in Groovy.
-Shubhra’s article covered both mutating the list in place and producing a new list,
-so we’ll cover both cases.</p>
-</div>
-</div>
-</div>
-<div class="sect1">
-<h2 id="_libraries_covered">Libraries covered</h2>
-<div class="sectionbody">
-<div class="paragraph">
-<p>Shubhra’s article examined <em>"out-of-the-box"</em> Java and some other collections libraries.
-We’ll look at using those same libraries with Groovy, but we’ll cover Eclipse Collections too.</p>
-</div>
-<div class="paragraph">
-<p>In summary, we’ll cover:</p>
-</div>
-<div class="ulist">
-<ul>
-<li>
-<p><em>"Out-of-the-box"</em> <a href="https://groovy-lang.org/">Groovy</a> (which includes JDK functionality)</p>
-</li>
-<li>
-<p><a href="https://github.com/google/guava/wiki">Guava</a> which provides a number of extensions to the JDK collections ecosystem. In particular, it has immutable collections, new collection types like multisets and bidirectional maps and various powerful extensions and utilities.</p>
-</li>
-<li>
-<p><a href="https://commons.apache.org/proper/commons-collections/">Apache Commons Collections</a> which extends upon the JDK collections framework adding some new types like bidirectional maps and bags
-as well as providing many comparator and iterator implementations. The library was designed to fill
-gaps in the JDK offerings and while some of those gaps in the JDK have now been filled by the JDK
-itself, Commons Collections still contains much useful functionality.</p>
-</li>
-<li>
-<p><a href="https://www.eclipse.org/collections/">Eclipse Collections</a> which comes with many container types including
-immutable collections, primitive collections, bimaps, multimaps and bags as well as numerous utility
-methods. It focuses on reduced memory footprint and efficient containers. It might be particularly
-of interest if you need primitive collections, immutable collections or some more exotic collection
-types like bag or bidirectional maps.</p>
-</li>
-</ul>
-</div>
-</div>
-</div>
-<div class="sect1">
-<h2 id="_mutating_a_list_to_remove_its_nulls">Mutating a list to remove its nulls</h2>
-<div class="sectionbody">
-<div class="sect2">
-<h3 id="_groovy">Groovy</h3>
-<div class="paragraph">
-<p>With Groovy, we can follow Java’s lead and use <code>removeIf</code> or use Groovy’s <code>removeAll</code>.
-In either case, we can use a method reference, closure syntax or lambda syntax
-to capture the desired non-null constraint.</p>
+<p>In computer science, <a href="https://en.wikipedia.org/wiki/Zipping_(computer_science)">zipping</a> translates sequences into sequences where, if visualized in two dimensions, the rows and columns are swapped. So the zip of:</p>
</div>
<div class="listingblock">
<div class="content">
-<pre class="prettyprint highlight"><code data-lang="groovy">var list = ['A', null, 'B', null, 'C']
-list.removeIf(Objects::isNull)
-assert list.size() == 3</code></pre>
+<pre class="prettyprint highlight"><code data-lang="groovy">[['a', 'b', 'c'],
+[ 1 , 2 , 3 ]]</code></pre>
+</div>
</div>
+<div class="paragraph">
+<p>would be:</p>
</div>
<div class="listingblock">
<div class="content">
-<pre class="prettyprint highlight"><code data-lang="groovy">var list = ['A', null, 'B', null, 'C']
-list.removeAll(s -> s == null)
-assert list.size() == 3</code></pre>
-</div>
+<pre class="prettyprint highlight"><code data-lang="groovy">[['a', 1],
+['b', 2],
+['c', 3]]</code></pre>
</div>
</div>
-<div class="sect2">
-<h3 id="_guava">Guava</h3>
-<div class="listingblock">
-<div class="content">
-<pre class="prettyprint highlight"><code data-lang="groovy">var list = ['A', null, 'B', null, 'C']
-Iterables.removeIf(list, Predicates.isNull())
-assert list.size() == 3</code></pre>
+<div class="paragraph">
+<p>It’s a very handy operation and depending on the language, may be supported for tuples, lists, streams and other sequences or aggregates.</p>
</div>
+<div class="paragraph">
+<p>Java collections and streams don’t currently support such functionality out-of-the-box with various workarounds discussed <a href="https://dzone.com/articles/bridge-the-gap-of-zip-operation">here</a>. The summary: language and library design is hard; any zip implementation that Java provides would have some limitations baked in, so they instead provide the necessary primitives to allow folks to build their own implementations based on their specific requirements.</p>
</div>
+<div class="paragraph">
+<p>We’ll look at what Groovy provides and some of the available Java libraries that you can also use. The same caveats apply to these libraries, each will have its own implementation strengths and weaknesses.</p>
</div>
-<div class="sect2">
-<h3 id="_apache_commons_collections">Apache Commons Collections</h3>
-<div class="listingblock">
-<div class="content">
-<pre class="prettyprint highlight"><code data-lang="groovy">var list = ['A', null, 'B', null, 'C']
-CollectionUtils.filter(list, PredicateUtils.notNullPredicate())
-assert list.size() == 3</code></pre>
+<div class="paragraph">
+<p>We’ll use an example inspired by this <a href="https://twitter.com/TheDonRaab">Donald Raab</a> <a href="https://donraab.medium.com/make-or-append-me-a-string-c654f247373a">blog post</a>. It looks at zipping (and formatting) lists of strings containing "fall"-inspired emoji. Yes, it’s late spring for the southern hemisphere who also mostly call fall "autumn", but hopefully everyone will appreciate the inspiration.</p>
</div>
+<div class="paragraph">
+<p><span class="image"><img src="img/fall_emojis.png" alt="some fall inspired emojis" width="741"></span></p>
</div>
+<hr>
</div>
-<div class="sect2">
-<h3 id="_eclipse_collections">Eclipse Collections</h3>
-<div class="listingblock">
-<div class="content">
-<pre class="prettyprint highlight"><code data-lang="groovy">var list = Lists.mutable.of('A', null, 'B', null, 'C')
-list.withoutAll([null])
-assert list.size() == 3</code></pre>
</div>
+<div class="sect1">
+<h2 id="_groovy">Groovy</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Groovy uses the <code>transpose</code> method for zipping:</p>
</div>
+<div class="paragraph">
+<p><span class="image"><img src="img/ZippingCollectionsGroovy.png" alt="zipping example with Groovy"></span></p>
</div>
</div>
</div>
<div class="sect1">
-<h2 id="_producing_a_new_list_without_nulls">Producing a new list without nulls</h2>
+<h2 id="_eclipse_collections">Eclipse Collections</h2>
<div class="sectionbody">
-<div class="sect2">
-<h3 id="_groovy_2">Groovy</h3>
<div class="paragraph">
-<p>We can use Java streams as per the original article or avoid streams and use Groovy’s <code>findAll</code> method:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="prettyprint highlight"><code data-lang="groovy">assert ['A', null, 'B'].stream().filter(Objects::nonNull).toList().size() == 2
-assert ['A', null, 'B'].findAll(Objects::nonNull).size() == 2</code></pre>
-</div>
+<p>Eclipse Collections has a <code>zip</code> method on its list classes:</p>
</div>
<div class="paragraph">
-<p>In this case, we can also use <code>findAll</code> and <code>grep</code> no-arg shortcuts.
-These shortcuts follow <a href="https://groovy-lang.org/semantics.html#the-groovy-truth">Groovy truth</a>
-which will remove nulls but also empty Strings and zeros. This may or may not be what we want.</p>
+<p><span class="image"><img src="img/ZippingCollectionsEC.png" alt="zipping example with Eclipse Collections"></span></p>
</div>
-<div class="listingblock">
-<div class="content">
-<pre class="prettyprint highlight"><code data-lang="groovy">assert ['A', null, 'B'].findAll().size() == 2
-assert ['A', null, 'B'].grep().size() == 2
-
-assert ['A', null, 'B', '', 0].findAll().size() == 2
-assert ['A', null, 'B', '', 0].grep().size() == 2</code></pre>
</div>
</div>
+<div class="sect1">
+<h2 id="_guava">Guava</h2>
+<div class="sectionbody">
<div class="paragraph">
-<p>Groovy also has the <code>findResults</code> method which specifically looks
-for non-null results rather than applying Groovy truth:</p>
+<p>Guava has a streams utility class with a <code>zip</code> method:</p>
</div>
-<div class="listingblock">
-<div class="content">
-<pre class="prettyprint highlight"><code data-lang="groovy">assert ['A', null, 'B'].findResults{ it }.size() == 2
-assert ['A', null, 'B'].findResults().size() == 2 // <b class="conum">(1)</b>
-assert ['A', null, 'B', '', 0].findResults().size() == 4 // <b class="conum">(1)</b></code></pre>
+<div class="paragraph">
+<p><span class="image"><img src="img/ZippingCollectionsGuava.png" alt="zipping example with Guava"></span></p>
</div>
</div>
-<div class="colist arabic">
-<ol>
-<li>
-<p>The no-arg shortcut variants are available from Groovy 4.0.9 onwards.</p>
-</li>
-</ol>
</div>
+<div class="sect1">
+<h2 id="_streamex">StreamEx</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>StreamEx provides an enhanced stream library which supports <code>zipWith</code>:</p>
</div>
-<div class="sect2">
-<h3 id="_guava_2">Guava</h3>
-<div class="listingblock">
-<div class="content">
-<pre class="prettyprint highlight"><code data-lang="groovy">assert Iterables.filter(['A', null, 'B'], Predicates.notNull()).size() == 2</code></pre>
+<div class="paragraph">
+<p><span class="image"><img src="img/ZippingCollectionsStreamEx.png" alt="zipping example with StreamEx"></span></p>
</div>
</div>
</div>
-<div class="sect2">
-<h3 id="_apache_commons_collections_2">Apache Commons Collections</h3>
-<div class="listingblock">
-<div class="content">
-<pre class="prettyprint highlight"><code data-lang="groovy">assert CollectionUtils.select(['A', null, 'B'], PredicateUtils.notNullPredicate()).size() == 2</code></pre>
+<div class="sect1">
+<h2 id="_vavr">Vavr</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Vavr has a <code>zipWith</code> method on its list class:</p>
</div>
+<div class="paragraph">
+<p><span class="image"><img src="img/ZippingCollectionsVavr.png" alt="zipping example with Vavr"></span></p>
</div>
</div>
-<div class="sect2">
-<h3 id="_eclipse_collections_2">Eclipse Collections</h3>
-<div class="listingblock">
-<div class="content">
-<pre class="prettyprint highlight"><code data-lang="groovy">assert Lists.mutable.of('A', null, 'B').select(Predicates.notNull()).size() == 2</code></pre>
</div>
+<div class="sect1">
+<h2 id="_jooλ">jOOλ</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>jOOλ has a <code>zip</code> method for its sequences:</p>
</div>
+<div class="paragraph">
+<p><span class="image"><img src="img/ZippingCollectionsJool.png" alt="zipping example with jOOλ"></span></p>
</div>
</div>
</div>
<div class="sect1">
-<h2 id="_other_null_related_functionality">Other null related functionality</h2>
+<h2 id="_groovy_gquery">Groovy GQuery</h2>
<div class="sectionbody">
<div class="paragraph">
-<p>Before concluding, we should mention some other Groovy functionality related to null.
-Although not related to list processing, Groovy’s <code>@NullCheck</code> AST transform is useful
-to automatically add null checking into your own classes, methods, and constructors. For further details,
-see the <a href="https://docs.groovy-lang.org/latest/html/documentation/#xform-NullCheck">documentation</a>.</p>
+<p>If you are a fan of query-like DSLs, Groovy’s language integrated query, GQuery (AKA GINQ), can also be used:</p>
+</div>
+<div class="paragraph">
+<p><span class="image"><img src="img/ZippingCollectionsGQ.png" alt="zipping example with GQuery"></span></p>
+</div>
+<div class="paragraph">
+<p>This uses a special <code>_rn</code> "row number" pre-defined variable in GQ expressions. It follows the same strategy as the IntStream "workaround" for Java mentioned in this <a href="https://www.baeldung.com/java-collections-zip">blog</a>.</p>
</div>
</div>
</div>
<div class="sect1">
-<h2 id="_further_information">Further Information</h2>
+<h2 id="_more_information">More information</h2>
<div class="sectionbody">
-<div class="ulist">
-<ul>
-<li>
-<p>Java – Remove all nulls from a List (<a href="https://www.programmergirl.com/java-remove-nulls-from-list/">original</a> and <a href="https://www.javacodegeeks.com/2019/03/java-remove-nulls-from-list.html">javacodegeeks</a>)</p>
-</li>
-<li>
-<p>Eclipse Collections (<a href="https://www.eclipse.org/collections/">website</a> and <a href="https://github.com/eclipse/eclipse-collections">github site</a>)</p>
-</li>
-<li>
-<p>Guava (<a href="https://github.com/google/guava/wiki">user guide</a>)</p>
-</li>
-<li>
-<p>Apache Commons Collections (<a href="https://commons.apache.org/proper/commons-collections/">website</a>)</p>
-</li>
-</ul>
-</div>
<div class="paragraph">
-<p>Have fun processing nulls with Groovy!</p>
+<p>The code examples can be found in the <a href="https://github.com/paulk-asert/zipping-collections">repo</a></p>
</div>
</div>
</div></div></div></div></div><footer id='footer'>