掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
在日常開發(fā)中,我們會使用很多工具類來提升項目開發(fā)的速度,而國內(nèi)用的比較多的 Hutool 框架,就是其中之一。

先來看官方對于 Hutool 的定義:
Hutool 是一個小而全的 Java 工具類庫,通過靜態(tài)方法封裝,降低相關(guān) API 的學(xué)習(xí)成本,提高工作效率,使 Java 擁有函數(shù)式語言般的優(yōu)雅,讓 Java 語言也可以“甜甜的”。
Hutool 中的工具方法來自每個用戶的精雕細(xì)琢,它涵蓋了 Java 開發(fā)底層代碼中的方方面面,它既是大型項目開發(fā)中解決小問題的利器,也是小型項目中的效率擔(dān)當(dāng);
Hutool 是項目中“util”包友好的替代,它節(jié)省了開發(fā)人員對項目中公用類和公用工具方法的封裝時間,使開發(fā)專注于業(yè)務(wù),同時可以最大限度的避免封裝不完善帶來的 bug。
Hutool 官方文檔:https://doc.hutool.cn/
Hutool 包含以下模塊:
|
模塊 |
介紹 |
|
hutool-aop |
JDK 動態(tài)代理封裝,提供非 IOC 下的切面支持。 |
|
hutool-bloomFilter |
布隆過濾,提供一些 Hash 算法的布隆過濾。 |
|
hutool-cache |
簡單緩存實現(xiàn)。 |
|
hutool-core |
核心,包括 Bean 操作、日期、各種Util等。 |
|
hutool-cron |
定時任務(wù)模塊,提供類 Crontab 表達(dá)式的定時任務(wù)。 |
|
hutool-crypto |
加密解密模塊,提供對稱、非對稱和摘要算法封裝。 |
|
hutool-db |
JDBC 封裝后的數(shù)據(jù)操作,基于 ActiveRecord思想。 |
|
hutool-dfa |
基于 DFA 模型的多關(guān)鍵字查找。 |
|
hutool-extra |
擴展模塊,對第三方封裝(模板引擎、郵件、Servlet、二維碼、Emoji、FTP、分詞等)。 |
|
hutool-http |
基于 HttpUrlConnection 的 Http 客戶端封裝。 |
|
hutool-log |
自動識別日志實現(xiàn)的日志門面。 |
|
hutool-script |
腳本執(zhí)行封裝,例如 Javascript。 |
|
hutool-setting |
功能更強大的 Setting 配置文件和 Properties 封裝。 |
|
hutool-system |
系統(tǒng)參數(shù)調(diào)用封裝(JVM 信息等)。 |
|
hutool-json |
JSON 實現(xiàn)。 |
|
hutool-captcha |
圖片驗證碼實現(xiàn)。 |
|
hutool-poi |
針對 POI 中 Excel 和 Word 的封裝。 |
|
hutool-socket |
基于 Java 的 NIO 和 AIO 的 Socket 封裝。 |
|
hutool-jwt |
JSON Web Token(JWT)封裝實現(xiàn)。 |
首先,在項目的 pom.xml 的 dependencies 中加入以下內(nèi)容:
cn.hutool
hutool-all
5.8.16
在 Java 中,Apache 的 HttpClient 用的比較多,但是由于此包較為龐大,API 又比較難用,因此并不適用很多場景,而 Hutool 的 Hutool-http 針對 JDK 的 HttpUrlConnection 做一層封裝,簡化了 HTTPS 請求、文件上傳、Cookie 記憶等操作,使 Http 請求變得無比簡單。
具體使用,例如發(fā)送一個 GET 請求:
// GET請求
String content = HttpUtil.get(url);發(fā)送一個 POST 請求:
// POST 請求
HashMap param = new HashMap<>();
paramMap.put("city", "西安");
String result1 = HttpUtil.post("www.javacn.site", param); 例如,生成手機驗證碼(4 位或 6 位),使用 Hutool 的這個功能就再也合適不過了,具體實現(xiàn)代碼如下:
// 生成 4 位隨機驗證碼
String verificationCode = RandomUtil.randomStringUpper(4);Hutool 封裝了拼音的門面,用于兼容以下拼音庫:
和其它門面模塊類似,采用 SPI 方式識別所用的庫。例如你想用 Pinyin4j,只需引入 jar,Hutool 即可自動識別。
以下為 Hutool 支持的拼音庫的 pom 坐標(biāo),你可以選擇任意一個引入項目中,如果引入多個,Hutool 會按照以上順序選擇第一個使用。
TinyPinyin 依賴:
io.github.biezhi
TinyPinyin
2.0.3.RELEASE
JPinyin 依賴:
com.belerweb
pinyin4j
2.5.1
Pinyin4j 依賴:
com.github.stuxuhai
jpinyin
1.1.8
// 輸出結(jié)果:ni hao
String pinyin = PinyinUtil.getPinyin("你好", " ");這里定義的分隔符為空格,你也可以按照需求自定義分隔符,亦或者使用 "" 代表無分隔符。
// 輸出結(jié)果:h, s, d, y, g
String result = PinyinUtil.getFirstLetter("H是第一個", ", ");Pinyin4jEngine engine = new Pinyin4jEngine();
// 輸出結(jié)果:ni hao h
String pinyin = engine.getPinyin("你好h", " ");Hutool 通過封裝 TimeInterval 實現(xiàn)計時器功能,即可以計算方法或過程執(zhí)行的時間。
具體使用如下:
TimeInterval timer = DateUtil.timer();
// todo:執(zhí)行具體業(yè)務(wù)
timer.interval(); // 花費毫秒數(shù)
timer.intervalRestart();// 返回花費時間,并重置開始時間
timer.intervalMinute(); // 花費分鐘數(shù)也可以實現(xiàn)分組計時:
final TimeInterval timer = new TimeInterval();
// 分組 1
timer.start("1");
ThreadUtil.sleep(1000);
// 分組 2
timer.start("2");
ThreadUtil.sleep(2000);
// 打印時間
Console.log("Timer 1 took {} ms", timer.intervalMs("1"));
Console.log("Timer 2 took {} ms", timer.intervalMs("2"));NumberUtil 數(shù)字工具針對數(shù)學(xué)運算做工具性封裝。
我最喜歡使用它的保留小時和數(shù)字格式化,下面一起來看吧。
保留小數(shù)的方法主要有兩種:
具體實現(xiàn)如下。
NumberUtil.round 方法使用:
double te1=123456.123456;
double te2=123456.128456;
Console.log(round(te1,4)); // 結(jié)果:123456.1235
Console.log(round(te2,4)); // 結(jié)果:123456.1285NumberUtil.roundStr 方法使用:
double te1=123456.123456;
double te2=123456.128456;
Console.log(roundStr(te1,2));//結(jié)果:123456.12
Console.log(roundStr(te2,2));//結(jié)果:123456.13針對 DecimalFormat.format 進行簡單封裝。按照固定格式對 double 或 long 類型的數(shù)字做格式化操作,具體實現(xiàn)如下:
long c = 299792458; // 光速
String format = NumberUtil.decimalFormat(",###", c); // 299,792,458格式中主要以 # 和 0 兩種占位符號來指定數(shù)字長度。0 表示如果位數(shù)不足則以 0 填充,# 表示只要有可能就把數(shù)字拉上這個位置。
在數(shù)據(jù)處理或清洗中,可能涉及到很多隱私信息的脫敏工作,因此Hutool針對常用的信息封裝了一些脫敏方法。
現(xiàn)階段支持的脫敏數(shù)據(jù)類型包括:
整體來說,所謂脫敏就是隱藏掉信息中的一部分關(guān)鍵信息,用*代替,自定義隱藏可以使用 StrUtil.hide 方法完成。
我們以身份證號碼為例:
// 5***************1X
DesensitizedUtil.idCardNum("51343620000320711X", 1, 2);對于約定俗成的脫敏,我們可以不用指定隱藏位數(shù),比如手機號:
// 180****1999
DesensitizedUtil.mobilePhone("18049531999");當(dāng)然還有一些簡單粗暴的脫敏,比如密碼,只保留了位數(shù)信息:
// **********
DesensitizedUtil.password("1234567890");在 Java 中發(fā)送郵件主要依靠 javax.mail 包,但是由于使用比較繁瑣,因此 Hutool 針對其做了封裝 MailUtil,它的使用主要需要兩步:
com.sun.mail
javax.mail
1.6.2
// 發(fā)送普通文本郵件,最后一個參數(shù)可選是否添加多個附件
MailUtil.send("[email protected]", "測試", "郵件來自磊哥測試", false);
// 發(fā)送 HTML 格式的郵件并附帶附件,最后一個參數(shù)可選是否添加多個附件:
MailUtil.send("[email protected]", "測試", "郵件來自磊哥測試
", true, FileUtil.file("d:/aaa.xml"));
// 群發(fā)郵件,可選 HTML 或普通文本,可選多個附件:
ArrayList tos = CollUtil.newArrayList(
"[email protected]",
"[email protected]",
"[email protected]",
"[email protected]");
MailUtil.send(tos, "測試", "郵件來自磊哥群發(fā)測試", false); 布隆過濾器(英語:Bloom Filter)是 1970 年由布隆提出的。它實際上是一個很長的二進制向量和一系列隨機映射函數(shù)。布隆過濾器可以用于檢索一個元素是否在一個集合中。它的優(yōu)點是空間效率和查詢時間都遠(yuǎn)遠(yuǎn)超過一般的算法,缺點是有一定的誤識別率和刪除困難。
布隆過濾器的原理是,當(dāng)一個元素被加入集合時,通過 K 個散列函數(shù)將這個元素映射成一個位數(shù)組中的 K 個點,把它們置為 1。檢索時,我們只要看看這些點是不是都是 1 就(大約)知道集合中有沒有它了:如果這些點有任何一個 0,則被檢元素一定不在;如果都是 1,則被檢元素很可能在。這就是布隆過濾器的基本思想。參考:https://www.cnblogs.com/z941030/p/9218356.html
布隆過濾器的具體使用如下:
// 初始化
BitMapBloomFilter filter = new BitMapBloomFilter(10);
filter.add("123");
filter.add("abc");
filter.add("ddd");
// 查找
filter.contains("abc")不是代碼寫不起,而是 Hutool 更有性價比。正如官方描述的那樣,使用 Hutool 會有種甜甜的感覺,磨刀不誤砍柴工,Hutool 用上之后代碼嘎嘎香,快去試試吧~

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流