• 梳理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 类.

  • 相关阅读:
    8 Django 模型层(1)
    7 Django的模板层
    Java ClassLoader
    Spring的注入注解
    Java 面试Spring的加载机制
    Spring容器启动初始化bean的方法
    java 线程
    经典博客
    Spring注解@Component、@Repository、@Service、@Controller区别
    java 实现多个文件的Zip包的生成
  • 原文地址:https://www.cnblogs.com/wuqinglong/p/11422631.html
Copyright © 2020-2023  润新知