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 类.

梳理commons-lang工具包的更多相关文章

  1. Java工具类之Apache的Commons Lang和BeanUtils

    Apache Commons包估计是Java中使用最广发的工具包了,很多框架都依赖于这组工具包中的一部分,它提供了我们常用的一些编程需要,但是JDK没能提供的机能,最大化的减少重复代码的编写. htt ...

  2. apache commons lang架包介绍

    commons lang组件介绍和学习 介绍 Java语言开发时有一个隐患,那就是java支持null值,这就导致很多时候操作可能会出异常. 因此很多第三方组件都会提供安全null safe 操作(即 ...

  3. Apache Commons Lang

    http://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/package- ...

  4. 让时间处理简单化 【第三方扩展类库org.apache.commons.lang.time】

    JAVA的时间日期处理一直是一个比较复杂的问题,大多数程序员都不能很轻松的来处理这些问题.首先Java中关于时间的类,从 JDK 1.1 开始,Date的作用很有限,相应的功能已由Calendar与D ...

  5. 关于出现 org.apache.commons.lang.exception.NestableRuntimeException的解决方法

    最近做服务端和客户端之间的访问,出现了 org.apache.commons.lang.exception.NestableRuntimeException等状况.实在令人头大,翻到了一个很好的帖子说 ...

  6. org.apache.commons.lang.StringUtils中常用的方法

    org.apache.commons.lang.StringUtils中常用的方法,这里主要列举String中没有,且比较有用的方法: 1. 检查字符串是否为空: static boolean isB ...

  7. java转换json需要导入的jar包,org/apache/commons/lang/exception/NestableRuntimeException

    缺少相应jar包都会有异常,根据异常找jar包导入......     这里我说下lang包,因为这个包我找了好半天:   我用的是: commons-lang3-3.1.jar  出现异常: jav ...

  8. org.apache.commons.lang.StringUtils类

    org.apache.commons.lang.StringUtils类 本文摘自:(http://www.blogjava.net/japper/archive/2012/05/23/378946. ...

  9. java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntim [问题点数:40分,结帖人wangxiaohua_001]

    14:56:10.093 WARN!! Error for /butterfly/plugins/zhonghang/UsefulData/save_usefuldata.bshjava.lang.N ...

  10. java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils

    java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils Caused by: java.lang.ClassNotFou ...

随机推荐

  1. Spring_AOP基于AspectJ的注解开发&JDBC的模板使用&事务管理(学习笔记3)

    一:AOP基于AspectJ的注解开发 1,简单的实例: 1)引入相应的jar包 ​ 2)在配置文件里引入相关约束 <beans xmlns="http://www.springfra ...

  2. MapReduce之WordCount

    用户统计文件中的单词出现的个数 注意各个文件的导包,job的封装步骤 WordCountMapper.java package top.wintp.mapreduce.wordcount; impor ...

  3. spark 源码分析之十八 -- Spark存储体系剖析

    本篇文章主要剖析BlockManager相关的类以及总结Spark底层存储体系. 总述 先看 BlockManager相关类之间的关系如下: 我们从NettyRpcEnv 开始,做一下简单说明. Ne ...

  4. 从0系统学Android-2.4隐式Intent

    本系列文章,参考<第一行代码>,作为个人笔记 更多内容:更多精品文章分类 使用隐式 Intent 相对于显示 Intent ,隐式 Intent 比较含蓄.这种方式不明确指出我们想要启动哪 ...

  5. 用户体验要素——产品系统设计方法

    用户体验已经成为了每个互联网人的口头词,特别是互联网产品经理或产品设计师. 的确,对于任何一个互联网产品而言,体验都是非常重要的. 但是具体的用户体验到底指的是哪些方面,界面,UI,还是交互,其中到底 ...

  6. 比特币and区块链

    比特币简介 比特币(Bitcoin:比特金)最早是一种网络虚拟货币,可以购买现实生活当中的物品.它的特点是分散化.匿名.只能在数字世界使用,不属于任何国家和金融机构,并且不受地域的限制,可以在世界上的 ...

  7. Log4Net 配置日志按日期和日志级别分类写入

    配置效果图: 配置代码: <?xml version="1.0" encoding="utf-8" ?> <log4net> <! ...

  8. 七分钟理解什么是 KMP 算法

    本文是介绍 什么是 BF算法.KMP算法.BM算法 三部曲之一. KMP算法 内部涉及到的数学原理与知识太多,本文只会对 KMP算法 的运行过程. 部分匹配表 .next数组 进行介绍,如果理解了这三 ...

  9. interceptor拦截器

    fifter.servlet.interceptor fifter用来处理请求头.请求参数.编码的一些设置,然后转交给servlet,处理业务,返回 servlet现在常用的spring,servle ...

  10. 【Java例题】3.6 计算arcsin(x)的值

    6.使用泰勒展开式计算arcsin(x)的值. arcsin(x)=x+x^3/(2*3)+1*3*x^5/(2*4*5)+...+ (2n)!*x^(2n+1)/(2^2n)*(n!)^2*(2n+ ...