梳理commons-lang工具包



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)

主要方法有以下幾類:

  1. ArrayUtils.clone() : 復制一個數組, 如果是 null, 返回 null
  2. ArrayUtils.nullToEmpty() : 如果傳入的是 null, 則返回一個空數組
  3. ArrayUtils.subarray() : 對數組進行截取
  4. Arrayutils.isSameLength() : 判斷兩個數組的長度是否相等
  5. ArrayUtils.reverse() : 反轉一個數組
  6. ArrayUtils.swap() : 對數組中的兩個指定位置的元素進行交換位置.
  7. ArrayUtils.shift() : 隨機打亂數組
  8. ArrayUtils.indexOf() : 定位指定元素在數組中的下標
  9. ArrayUtils.lastIndexOf() : 從后向前查找元素的下標
  10. ArrayUtils.contains() : 判斷數組是否包含某個元素
  11. ArrayUtils.toPrimitive() : 將包裝類型的數組轉為原始類型
  12. ArrayUtils.toObject() : 將原始類型的數組轉為包裝類型
  13. ArrayUtils.isEmpty() : 判斷數組是否為空
  14. ArrayUtils.isNotEmpty() : 判斷數組是否非空
  15. ArrayUtils.add() : 添加元素到數組
  16. ArrayUtils.remove() : 從數組中移除元素
  17. ArrayUtils.isSorted() : 判斷數組是否是有序的
  18. ArrayUtils.insert() : 向數組中的指定位置插入元素, 后面的元素往后移動
  19. 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 類.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM