<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>工具类 - tag - 沐木</title><link>https://oldletter.cn/tags/%E5%B7%A5%E5%85%B7%E7%B1%BB/</link><description>工具类 - tag - 沐木</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Fri, 10 Oct 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://oldletter.cn/tags/%E5%B7%A5%E5%85%B7%E7%B1%BB/" 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><item><title>常用工具类汇总：SM2/SM4/拼音/文件/HTTP 全覆盖</title><link>https://oldletter.cn/posts/java-04-utils/</link><pubDate>Fri, 10 Oct 2025 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/java-04-utils/</guid><description><![CDATA[<blockquote>
<p>📅 2026-05-15 | 🏷️ Java, 工具类, 国密, Hutool | 📖 阅读约 18 分钟</p></blockquote>
<h2 id="一背景">一、背景</h2>
<p>多年项目中积累了不少高频使用的工具代码。它们不算复杂，但每次要用的时候都得翻老项目找，效率很低。这篇文章把它们整理出来，统一收录，方便查阅和复用。</p>
<p>每个工具都包含：<strong>使用场景 → 完整代码 → 调用示例</strong>。</p>
<div class="details admonition tip open">
    <div class="details-summary admonition-title">
        <i class="icon far fa-lightbulb" aria-hidden="true"></i>不要重复造轮子<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content"><p>在动手写工具类之前，先看看成熟库是否已经提供了：</p>
<ul>
<li><strong>Hutool 5.8.44</strong>（2026-03-11）：国人开发的 Java 工具库，覆盖字符串、日期、加密、HTTP、JSON 等 90% 的工具需求，API 简洁</li>
<li><strong>Apache Commons</strong>：<code>commons-lang3</code>、<code>commons-io</code>、<code>commons-collections</code> 等，稳定可靠</li>
<li><strong>Guava</strong>：Google 的 Java 工具库，集合、缓存、并发工具强大</li>
</ul>
<p>本文在每个工具节的末尾都会给出&quot;成熟库替代方案&quot;，<strong>优先使用成熟库，只在特定需求时手写</strong>。</p>
</div>
    </div>
</div>
<hr>
<h2 id="二字符串工具">二、字符串工具</h2>
<h3 id="21-中文姓名转拼音生成邮箱账号">2.1 中文姓名转拼音生成邮箱账号</h3>
<p><strong>场景：</strong> 新员工入职系统自动生成企业邮箱，规则是&quot;名.姓@company.com&quot;，需要支持复姓（如诸葛孔明 → <a href="mailto:kongming.zhuge@company.com" rel="">kongming.zhuge@company.com</a>）。</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">cn.hutool.extra.pinyin.PinyinUtil</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="kn">import</span><span class="w"> </span><span class="nn">java.util.Arrays</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.HashSet</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.Set</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="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 中文姓名转拼音邮箱账号工具
</span></span></span><span class="line"><span class="cl"><span class="cm"> *
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 支持：
</span></span></span><span class="line"><span class="cl"><span class="cm"> * - 单姓：张三 → san.zhang
</span></span></span><span class="line"><span class="cl"><span class="cm"> * - 复姓：诸葛孔明 → kongming.zhuge
</span></span></span><span class="line"><span class="cl"><span class="cm"> * - 单名：张伟 → wei.zhang
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">PinyinEmailUtil</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="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm">     * 中国常见复姓集合（可根据需要扩充）
</span></span></span><span class="line"><span class="cl"><span class="cm">     */</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">Set</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="w"> </span><span class="n">COMPOUND_SURNAMES</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">HashSet</span><span class="o">&lt;&gt;</span><span class="p">(</span><span class="n">Arrays</span><span class="p">.</span><span class="na">asList</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="s">&#34;欧阳&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;太史&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;端木&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;上官&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;司马&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;东方&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;独孤&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;南宫&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="s">&#34;万俟&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;闻人&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;夏侯&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;诸葛&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;尉迟&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;公羊&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;赫连&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;澹台&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="s">&#34;皇甫&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;宗政&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;濮阳&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;公冶&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;太叔&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;申屠&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;公孙&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;慕容&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="s">&#34;仲孙&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;钟离&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;长孙&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;宇文&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;司徒&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;鲜于&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;司空&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;闾丘&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="s">&#34;子车&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;亓官&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;司寇&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;巫马&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;公西&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;颛孙&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;壤驷&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;公良&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="s">&#34;漆雕&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;乐正&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;宰父&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;谷梁&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;拓跋&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;夹谷&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;轩辕&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;令狐&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="s">&#34;段干&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;百里&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;呼延&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;东郭&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;南门&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;羊舌&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;微生&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;公户&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="s">&#34;公玉&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;公仪&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;梁丘&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;公仲&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;公上&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;公门&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;公山&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;公坚&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="s">&#34;左丘&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;公伯&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;西门&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;公祖&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;第五&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;公乘&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;贯丘&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;公皙&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="s">&#34;南荣&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;东里&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;东宫&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;仲长&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;子书&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;子桑&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;即墨&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;达奚&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="s">&#34;褚师&#34;</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="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm">     * 将中文姓名转换为拼音邮箱账号
</span></span></span><span class="line"><span class="cl"><span class="cm">     *
</span></span></span><span class="line"><span class="cl"><span class="cm">     * @param chineseName 中文姓名（如 &#34;诸葛孔明&#34;）
</span></span></span><span class="line"><span class="cl"><span class="cm">     * @param domain      邮箱域名（如 &#34;company.com&#34;）
</span></span></span><span class="line"><span class="cl"><span class="cm">     * @return 邮箱账号（如 &#34;kongming.zhuge@company.com&#34;）
</span></span></span><span class="line"><span class="cl"><span class="cm">     */</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="nf">toEmail</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">chineseName</span><span class="p">,</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">domain</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="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">chineseName</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">chineseName</span><span class="p">.</span><span class="na">length</span><span class="p">()</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">2</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="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">IllegalArgumentException</span><span class="p">(</span><span class="s">&#34;姓名至少需要2个字符&#34;</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="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">String</span><span class="w"> </span><span class="n">surname</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">String</span><span class="w"> </span><span class="n">givenName</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">String</span><span class="w"> </span><span class="n">firstTwo</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">chineseName</span><span class="p">.</span><span class="na">substring</span><span class="p">(</span><span class="n">0</span><span class="p">,</span><span class="w"> </span><span class="n">2</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">COMPOUND_SURNAMES</span><span class="p">.</span><span class="na">contains</span><span class="p">(</span><span class="n">firstTwo</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">surname</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">firstTwo</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">givenName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">chineseName</span><span class="p">.</span><span class="na">substring</span><span class="p">(</span><span class="n">2</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="w"> </span><span class="k">else</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">surname</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">chineseName</span><span class="p">.</span><span class="na">substring</span><span class="p">(</span><span class="n">0</span><span class="p">,</span><span class="w"> </span><span class="n">1</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">givenName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">chineseName</span><span class="p">.</span><span class="na">substring</span><span class="p">(</span><span class="n">1</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="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">String</span><span class="w"> </span><span class="n">surnamePinyin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">PinyinUtil</span><span class="p">.</span><span class="na">getPinyin</span><span class="p">(</span><span class="n">surname</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">String</span><span class="w"> </span><span class="n">givenNamePinyin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">PinyinUtil</span><span class="p">.</span><span class="na">getPinyin</span><span class="p">(</span><span class="n">givenName</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;&#34;</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="k">return</span><span class="w"> </span><span class="n">givenNamePinyin</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&#34;.&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">surnamePinyin</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&#34;@&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">domain</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="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="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm">     * 仅生成邮箱前缀（不含域名）
</span></span></span><span class="line"><span class="cl"><span class="cm">     */</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="nf">toEmailPrefix</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">chineseName</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">String</span><span class="w"> </span><span class="n">prefix</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">toEmail</span><span class="p">(</span><span class="n">chineseName</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;&#34;</span><span class="p">).</span><span class="na">replace</span><span class="p">(</span><span class="s">&#34;@&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;&#34;</span><span class="p">);</span><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="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">prefix</span><span class="p">.</span><span class="na">endsWith</span><span class="p">(</span><span class="s">&#34;.&#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">prefix</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">prefix</span><span class="p">.</span><span class="na">substring</span><span class="p">(</span><span class="n">0</span><span class="p">,</span><span class="w"> </span><span class="n">prefix</span><span class="p">.</span><span class="na">length</span><span class="p">()</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">1</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="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">return</span><span class="w"> </span><span class="n">prefix</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="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span></span></span></code></pre></div></div>
<p><strong>使用示例：</strong></p>]]></description></item></channel></rss>