title: 梳理commons-lang工具包
comments: false
date: 2019-08-27 16:01:42
description: 最熟悉的第三方工具包,你了解多少呢???
categories: Java
概述
對於 commons-lang 這個三方包, 作為 Java 開發應該都了解, 尤其是其中的 StringUtils 類, 然后剩余的呢? 可能就不知道了, 其實我們很多時候都在重復造輪子, 不是說重復造輪子並不好, 只不過這么簡單的輪子也就沒有必要再重復造了吧.
本文主要對 commons-lang 包下常用類的功能進行梳理.
builder包
The Builder interface is designed to designate a class as a builder object in the Builder design pattern.
上面引用 builder 包中的 Builder
接口的解釋, 該包下的類都實現了 builder
接口, 並使用了 Builder
設計模式.
該包主要有三個類:
CompareToBuilder
: 用於比較兩個類是否相等(指定屬性相等即相等)EqualsBuilder
: 用於幫助我們寫出一個好的 equals 方法HashCodeBuilder
: 用戶幫助我們寫出一個好的 hashcode 方法ToStringBuilder
: 用戶幫助我們寫出一個好的 toString 方法
使用樣例:
package com.snailwu.config;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.builder.*;
/**
* @author: 吳慶龍
* @date: 2019-08-27 16:34
*/
@Getter
@Setter
public class User implements Comparable<User> {
private String name;
private Integer age;
private String address;
@Override
public int compareTo(User o) {
// 要求每個屬性必須實現java.lang.Comparable接口, 否則會出現類轉換異常
return new CompareToBuilder()
.append(this.name, o.name)
.append(this.age, o.age)
.append(this.address, o.address)
.toComparison();
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (obj == this) {
return true;
}
if (obj.getClass() != getClass()) {
return false;
}
User o = (User) obj;
return new EqualsBuilder()
.appendSuper(super.equals(obj))
.append(this.name, o.name)
.append(this.age, o.age)
.append(this.address, o.address)
.isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder()
.append(this.name)
.append(this.age)
.append(this.address)
.toHashCode();
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.SIMPLE_STYLE)
.append(name)
.append(age)
.append(address)
.toString();
}
}
NumberUtils
Provides extra functionality for Java Number classes.
主要是為 Java 的 Number 類提供額外的功能.
轉換 String 類型為原始類型
以 int 類型為例.
方法:NumberUtils.toInt(String)
和 NumberUtils.toInt(String, int)
// 不含有默認值
NumberUtils.toInt(null) = 0
NumberUtils.toInt("") = 0
NumberUtils.toInt("1") = 1
// 帶有默認值
NumberUtils.toInt(null, 1) = 1
NumberUtils.toInt("", 1) = 1
NumberUtils.toInt("1", 0) = 1
截取小數位數
BigDecimal toScaledBigDecimal(BigDecimal, int, RoundingMode)
支持 BigDecimal
, Float
, Double
, String
類型的截取, 第二個參數是設置精度(scale).
默認使用的是 NumberUtils.toScaledBigDecimal(value, INTEGER_TWO, RoundingMode.HALF_EVEN)
, 即小數點后兩位, 使用 HALF_EVEN(銀行家舍入法: 向“最接近的”數字舍入, 如果與兩個相鄰數字的距離相等, 則向相鄰的偶數舍入) 進行舍入.
創建包裝類型
NumberUtils.createFloat(String)
: 創建 Float 對象NumberUtils.createDouble(String)
: 創建 Double 對象NumberUtils.createInteger(String)
: 創建 Integer 對象NumberUtils.createBigInteger(String)
: 創建 BigInteger 對象NumberUtils.createBigDecimal(String)
: 創建 BigDecimal 對象
也就類似於 Integer.parseInt(String)
, 只不過這里增加了對於 null 的校驗.
最大值 | 最小值
同樣, 以 int 數據類型為例.
NumberUtils.min(int ...)
NumberUtils.min(int, int, int)
NumberUtils.max(int ...)
NumberUtils.max(int, int, int)
關於數字的檢查
NumberUtils.isDigits(String)
: 檢查字符串中是否僅包含數字, 這里使用了StringUtils.isNumeric(str)
.NumberUtils.isCreatable(String)
: Checks whether the String a valid Java number. 包含八進制和十六進制的標志(0x | 0X), 也包含長整型的 L等.NumberUtils.isParsable(String)
: Checks whether the given String is a parsable number. 確保這些字符串被Integer#parseInt(String)
,Long#parseLong(String)
,Float#parseFloat(String)
,Double#parseDouble(String)
正確解析.
mutable包
里面對基本數據類型的加減乘除等基本運算進行了一次封裝.
relect包
主要類:
ConstructorUtils
: 構造方法相關的FieldUtils
: 屬性相關的MethodUtils
: 方法相關的TypeUtils
: 類型相關的
ConstructorUtils
主要有兩個功能:
- 獲取構造方法:
ConstructorUtils.getAccessibleConstructor(Class<T>, Class<?>...)
, 第二個參數為構造方法上的參數類型的Class. - 調用構造方法:
ConstructorUtils.invokeConstructor(Class<T>, Object...)
, 第二個參數為構造方法的參數.
FieldUtils
功能點:
- 獲取 Class 中的屬性 :
FieldUtils.getField(Class<?>, String)
- 讀取靜態屬性的值 :
FieldUtils.readStaticField(Field, boolean)
, 第二個參數是forceAccess
. - 讀取普通屬性的值 :
FieldUtils.readField(Object, String, boolean)
, 第一個參數是對象實例, 第二個參數是屬性名, 如果是 private 的, 則需要傳入 true 作為第三個參數. - 設置靜態屬性的值
- 設置普通屬性的值
MethodUtils
功能點:
- 獲取類中的方法:
MethodUtils.getAccessibleMethod(Class<?>, String, Class<?>...)
, 參數分別是 類, 方法名, 參數類型的Class. - 執行普通方法 :
MethodUtils.invoke(Object, String, Object...)
, 參數分別是 實例對象, 方法名, 方法參數. - 執行靜態方法:
MethodUtils.invoke(Class<T>, String, Object...)
TypeUtils
待整理.
time包
關於時間日期的操作.
主要有三個類:
DateFormatUtils
: 格式化日期, 線程安全的.DateUtils
: 封裝了對於時間日期的操作(加減等).StopWatch
: 用於計時, 與Guava的一樣.FastDateFormat
:SimpleDateFormat
的線程安全版本.
tuple包
包含不可變的
ImmutablePair
ImmutableTriple
以及可變的
MutablePair
MutableTriple
其中 MutablePair
類似於 Map, key-value 的形式, MutableTriple
則是存了三個值(三個屬性) .
ArrayUtils(ThreadSafe)
主要方法有以下幾類:
ArrayUtils.clone()
: 復制一個數組, 如果是 null, 返回 nullArrayUtils.nullToEmpty()
: 如果傳入的是 null, 則返回一個空數組ArrayUtils.subarray()
: 對數組進行截取Arrayutils.isSameLength()
: 判斷兩個數組的長度是否相等ArrayUtils.reverse()
: 反轉一個數組ArrayUtils.swap()
: 對數組中的兩個指定位置的元素進行交換位置.ArrayUtils.shift()
:隨機打亂數組ArrayUtils.indexOf()
: 定位指定元素在數組中的下標ArrayUtils.lastIndexOf()
: 從后向前查找元素的下標ArrayUtils.contains()
: 判斷數組是否包含某個元素ArrayUtils.toPrimitive()
: 將包裝類型的數組轉為原始類型ArrayUtils.toObject()
: 將原始類型的數組轉為包裝類型ArrayUtils.isEmpty()
: 判斷數組是否為空ArrayUtils.isNotEmpty()
: 判斷數組是否非空ArrayUtils.add()
: 添加元素到數組ArrayUtils.remove()
: 從數組中移除元素ArrayUtils.isSorted()
: 判斷數組是否是有序的ArrayUtils.insert()
: 向數組中的指定位置插入元素, 后面的元素往后移動ArrayUtils.shuffle()
: 隨機打亂數組
BooleanUtils
封裝了關於 boolean 值的操作, 不太常用.
CharUtils
封裝了關於 char 值的操作, 不太常用.
ClassUtils
封裝了關於 class 的操作, 比如:
ClassUtils.getShortClassName()
: 獲取 Class 的名字ClassUtils.getPackageName()
: 獲取 class 所在的包名ClassUtils.getAllSuperclasses()
: 獲取父類ClassUtils.getAllInterfaces()
: 獲取所有接口
Conversion
封裝了關於進制的轉換操作.
EnumUtils
封裝了關於枚舉類的操作, 里面的方法也不太好用, 可以看看源碼.
JavaVersion
包含所有的 Java 版本.
ObjectUtils
包含幾個常用方法:
ObjectUtils.isEmpty()
: 判斷字符串, 數組, 集合, Map是否為空ObjectUtls.defaultIfNull()
: 如果是 null, 則使用默認值ObjectUtils.CONST()
: 將普通類型轉為不可變類型, 就是加了個 final
RandomUtils & RandomStringUtils
隨機數生成器, 用於補充標准的 Random 類.
StringUtils(null-safe)
該工具類的注解比較好, 怎么使用以及使用結果都有.
這個工具類功能是有點多, 但是主要功能如下:
IsEmpty/IsBlank
: 判斷是否為空Trim/Strip
: 移除頭部和尾部的空格Equals/Compare
: 比較兩個字符串startsWith/endWith
: 判斷是否以給定字符串開始或結尾IndexOf/LastIndexOf/Contains
: 定位字符串IndexOfAny/LastIndexOfAny/IndexOfAnyBut/LastIndexOfAnyBut
:ContainsOnly/ContainsNone/ContainsAny
: 字符串是否包含(only, none, any)給定字符串Substring/Left/Right/Mid
: 擴展截取字符串SubstringBefore/SubstringAfter/SubstringBetween
: 字符串提取Split/Join
: 將String拆分為子串數組,反之亦然Remove/Delete
: 刪除子串Replace/Overlay
: 覆蓋子串Chomp/Chop
: 刪除最后的字符串(換行符/最后一個字符)AppendIfMissing/PrependIfMissing
: 判斷是否以指定字符串開頭或結尾, 如果不是則追加上.LeftPad/RightPad/Center/Repeat
: 填充字符串UpperCase/LowerCase/SwapCase/Capitalize/Uncapitalize
: 更改字符串的大小寫CountMatches
: 計算一個String在另一個String中出現的次數IsAlpha/IsNumeric/IsWhitespace/IsAsciiPrintable
: 檢查字符串中的字符DefaultString
: 防止空輸入字符串Rotate
: 旋轉(循環移位)一個字符串Reverse/ReverseDelimited
: 反轉一個字符串Abbreviate
: 使用省略號或其他給定的String縮寫字符串Difference
: 比較字符串並報告它們的差異
SystemUtils
System 類的擴展類, 比如
- 獲取
user.home
- 獲取
java.io.tmpdir
- 判斷 Java 版本
- 判斷操作系統
Validate
類似於Google的 Preconditions 類.