梳理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)
主要方法有以下几类:
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 类.
梳理commons-lang工具包的更多相关文章
- Java工具类之Apache的Commons Lang和BeanUtils
Apache Commons包估计是Java中使用最广发的工具包了,很多框架都依赖于这组工具包中的一部分,它提供了我们常用的一些编程需要,但是JDK没能提供的机能,最大化的减少重复代码的编写. htt ...
- apache commons lang架包介绍
commons lang组件介绍和学习 介绍 Java语言开发时有一个隐患,那就是java支持null值,这就导致很多时候操作可能会出异常. 因此很多第三方组件都会提供安全null safe 操作(即 ...
- Apache Commons Lang
http://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/package- ...
- 让时间处理简单化 【第三方扩展类库org.apache.commons.lang.time】
JAVA的时间日期处理一直是一个比较复杂的问题,大多数程序员都不能很轻松的来处理这些问题.首先Java中关于时间的类,从 JDK 1.1 开始,Date的作用很有限,相应的功能已由Calendar与D ...
- 关于出现 org.apache.commons.lang.exception.NestableRuntimeException的解决方法
最近做服务端和客户端之间的访问,出现了 org.apache.commons.lang.exception.NestableRuntimeException等状况.实在令人头大,翻到了一个很好的帖子说 ...
- org.apache.commons.lang.StringUtils中常用的方法
org.apache.commons.lang.StringUtils中常用的方法,这里主要列举String中没有,且比较有用的方法: 1. 检查字符串是否为空: static boolean isB ...
- java转换json需要导入的jar包,org/apache/commons/lang/exception/NestableRuntimeException
缺少相应jar包都会有异常,根据异常找jar包导入...... 这里我说下lang包,因为这个包我找了好半天: 我用的是: commons-lang3-3.1.jar 出现异常: jav ...
- org.apache.commons.lang.StringUtils类
org.apache.commons.lang.StringUtils类 本文摘自:(http://www.blogjava.net/japper/archive/2012/05/23/378946. ...
- 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 ...
- java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils
java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils Caused by: java.lang.ClassNotFou ...
随机推荐
- SpringBoot2.0集成WebSocket,实现后台向前端推送信息
感谢作者,支持原创: https://blog.csdn.net/moshowgame/article/details/80275084 什么是WebSocket? WebSocket协议是基于TCP ...
- [PTA] 数据结构与算法题目集 6-10 二分查找
Position BinarySearch(List L, ElementType X) { int beg = 1; int end = L->Last; while (beg <= e ...
- IOCP Input/Output Completion Port IO完成端口
I/O completion ports provide an efficient threading model for processing multiple asynchronous I/O r ...
- Java&mysql:过滤文件内容,将新文件内容存入mysql数据库
在上一篇博文jdbc连接数据库中我已经简单介绍了如何连接到mysql数据库,今天要总结的是学长给我布置的一个小作业,把一个很大的已经用","分开了的一行一行的txt文件内容过滤掉注 ...
- 转 java - 如何判断单链表有环
转自 https://blog.csdn.net/u010983881/article/details/78896293 1.穷举遍历 首先从头节点开始,依次遍历单链表的每一个节点.每遍历到一个新节点 ...
- 使用GDAL实现DEM的地貌晕渲图(三)
目录 1. 原理 1) ArcMap生成彩色晕渲图 2) 彩色色带赋值 3) 颜色叠加 2. 实现 3. 结语 4. 参考 1. 原理 之前在<使用GDAL实现DEM的地貌晕渲图(一)>和 ...
- Number() 与 parseInt()解析
在 Python 中,将字符串转为整型变量的函数是 int() ,直接使用 int("123")就可以得到 123的输出结果,这样可以比较快速的得到我们想要的结果,在 js 中将 ...
- cookbook_数据结构和算法
1.1将数据分解为单独的变量 list_a = [1,2,3,4,5,6,7,8,9] a,b,c,d,e,f,g,h,i = list_a print(a,b,c,d,e,f,g,h,i) #使用相 ...
- 【Java】Exception thrown by the agent : java.rmi.server.ExportException: Port already in use: 1099
详细信息如下: Error: Exception thrown by the agent : java.rmi.server.ExportException: Port already in use: ...
- 100天搞定机器学习|Day13-14 SVM的实现
昨天我们学习了支持向量机基本概念,重申数学推导原理的重要性并向大家介绍了一篇非常不错的文章.今天,我们使用Scikit-Learn中的SVC分类器实现SVM.我们将在day16使用kernel-tri ...