zoukankan      html  css  js  c++  java
  • 梳理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 类.

  • 相关阅读:
    ZOJ 2158 Truck History
    Knight Moves (zoj 1091 poj2243)BFS
    poj 1270 Following Orders
    poj 2935 Basic Wall Maze (BFS)
    Holedox Moving (zoj 1361 poj 1324)bfs
    ZOJ 1083 Frame Stacking
    zoj 2193 Window Pains
    hdu1412{A} + {B}
    hdu2031进制转换
    openjudge最长单词
  • 原文地址:https://www.cnblogs.com/wuqinglong/p/11422631.html
Copyright © 2011-2022 走看看