<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Stream - tag - 沐木</title><link>https://oldletter.cn/tags/stream/</link><description>Stream - tag - 沐木</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 03 Jun 2021 00:00:00 +0000</lastBuildDate><atom:link href="https://oldletter.cn/tags/stream/" rel="self" type="application/rss+xml"/><item><title>Java Stream 实用技巧：List 与 Map 的花式转换</title><link>https://oldletter.cn/posts/java-05-stream-utils/</link><pubDate>Thu, 03 Jun 2021 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/java-05-stream-utils/</guid><description><![CDATA[<h2 id="前言">前言</h2>
<p>Java 8 引入的 Stream API 彻底改变了我们处理集合数据的方式。相比传统的 for 循环，Stream 提供了声明式、链式、可组合的数据处理风格，代码更简洁，意图更清晰。</p>
<p>在日常开发中，我们经常面对这样的场景：从数据库查出一个 <code>List&lt;Map&gt;</code>，需要转成按某个 key 分组的 <code>Map</code>；两个接口返回的列表需要按 id 合并；或者需要对字段做批量转换。这些需求用 Stream 几行代码就能搞定，而传统写法往往要写一堆临时变量和嵌套循环。</p>
<p>本文整理了 7 个实用的 Stream 技巧，每个都附带完整可运行的示例代码，希望能帮助你在实际项目中写出更优雅的集合操作。</p>
<hr>
<h2 id="一list-转-mapkey-冲突处理">一、List 转 Map（key 冲突处理）</h2>
<p>基础也常见的操作。假设有一个用户列表，需要按 id 建索引：</p>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-java">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title=""><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">java.util.*</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kn">import</span><span class="w"> </span><span class="nn">java.util.stream.*</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">List</span><span class="o">&lt;</span><span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="p">,</span><span class="w"> </span><span class="n">Object</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="n">users</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">ArrayList</span><span class="o">&lt;&gt;</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">users</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">HashMap</span><span class="o">&lt;</span><span class="n">String</span><span class="p">,</span><span class="w"> </span><span class="n">Object</span><span class="o">&gt;</span><span class="p">()</span><span class="w"> </span><span class="p">{{</span><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="s">&#34;id&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">1L</span><span class="p">);</span><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="s">&#34;name&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;Alice&#34;</span><span class="p">);</span><span class="w"> </span><span class="p">}});</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">users</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">HashMap</span><span class="o">&lt;</span><span class="n">String</span><span class="p">,</span><span class="w"> </span><span class="n">Object</span><span class="o">&gt;</span><span class="p">()</span><span class="w"> </span><span class="p">{{</span><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="s">&#34;id&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">2L</span><span class="p">);</span><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="s">&#34;name&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;Bob&#34;</span><span class="p">);</span><span class="w"> </span><span class="p">}});</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">users</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">HashMap</span><span class="o">&lt;</span><span class="n">String</span><span class="p">,</span><span class="w"> </span><span class="n">Object</span><span class="o">&gt;</span><span class="p">()</span><span class="w"> </span><span class="p">{{</span><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="s">&#34;id&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">3L</span><span class="p">);</span><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="s">&#34;name&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;Charlie&#34;</span><span class="p">);</span><span class="w"> </span><span class="p">}});</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// 基本转换</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Map</span><span class="o">&lt;</span><span class="n">Long</span><span class="p">,</span><span class="w"> </span><span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="p">,</span><span class="w"> </span><span class="n">Object</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">users</span><span class="p">.</span><span class="na">stream</span><span class="p">()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">.</span><span class="na">collect</span><span class="p">(</span><span class="n">Collectors</span><span class="p">.</span><span class="na">toMap</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">m</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">Long</span><span class="p">)</span><span class="w"> </span><span class="n">m</span><span class="p">.</span><span class="na">get</span><span class="p">(</span><span class="s">&#34;id&#34;</span><span class="p">),</span><span class="w">   </span><span class="c1">// key mapper</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">m</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">m</span><span class="w">                      </span><span class="c1">// value mapper</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">));</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">result</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">//</span><span class="w"> </span><span class="p">{</span><span class="n">1</span><span class="o">=</span><span class="p">{</span><span class="n">name</span><span class="o">=</span><span class="n">Alice</span><span class="p">,</span><span class="w"> </span><span class="n">id</span><span class="o">=</span><span class="n">1</span><span class="p">},</span><span class="w"> </span><span class="n">2</span><span class="o">=</span><span class="p">{</span><span class="n">name</span><span class="o">=</span><span class="n">Bob</span><span class="p">,</span><span class="w"> </span><span class="n">id</span><span class="o">=</span><span class="n">2</span><span class="p">},</span><span class="w"> </span><span class="n">3</span><span class="o">=</span><span class="p">{</span><span class="n">name</span><span class="o">=</span><span class="n">Charlie</span><span class="p">,</span><span class="w"> </span><span class="n">id</span><span class="o">=</span><span class="n">3</span><span class="p">}}</span></span></span></code></pre></div></div>
<p><strong>踩坑提示</strong>：如果 key 有重复，<code>toMap</code> 会抛 <code>IllegalStateException</code>。解决方案是提供第三个参数，合并函数：</p>]]></description></item></channel></rss>