Apache Commons 项目包含了很多工具,并且非常好用,能提高我们的开发效率,在很多开源框架中使用广泛,所以….如果项目中引入了这些依赖,能用就用吧,起码 Apache 的应该是比自己写的强多了。。
另外,Google 的 Guava 也是非常好用的,也做了笔记,地址在这里。
常用工具一览表:
组件 | 功能介绍 |
---|---|
BeanUtils | 提供了对于JavaBean进行各种操作,克隆对象,属性等等. |
Betwixt | XML与Java对象之间相互转换. |
Codec | 处理常用的编码方法的工具类包 例如 DES、SHA1、MD5、Base64 等. |
Collections | java集合框架操作. |
Compress | java提供文件打包压缩类库. |
Configuration | 一个java应用程序的配置管理类库. |
DBCP | 提供数据库连接池服务. |
DbUtils | 提供对jdbc 的操作封装来简化数据查询和记录读取操作. |
java 发送邮件对 javamail 的封装. | |
FileUpload | 提供文件上传功能. |
HttpClien | 提供 HTTP 客户端与服务器的各种通讯操作. 现在已改成 HttpComponents |
IO | io 工具的封装. |
Lang | Java 基本对象方法的工具类包 如:StringUtils,ArrayUtils 等等. |
Logging | 提供的是一个 Java 的日志接口. |
Validator | 提供了客户端和服务器端的数据验证框架. |
BeanUtils
提供了对于 JavaBean 进行各种操作,比如对象,属性复制等等。
克隆对象: Person person2 = (Person)BeanUtils.cloneBean(person);
需要注意的是,cloneBean 方法拷贝对象只是浅拷贝,如果想深拷贝,可参考下面的代码
经测试,这种克隆效率很低,并且不是很稳定,推荐优先使用 Spring 的 BeanUtils 通过属性 copy 的方式来“克隆对象”。
1 | public class JavaBeanCopier { |
将一个 Map 对象转化为一个 Bean:
首先这个 Map 对象的 key 必须与 Bean 的属性相对应:
1 | Map map = new HashMap(); |
使用场景嘛…..如果不使用 web 层框架,还记得被 request.getParameter 支配的恐惧….
bean 的属性拷贝:
在拼装 VO 或者 DTO 的时候非常有用吧:BeanUtils.copyProperties(source, target);
需要注意的是,除了属性名要一致,属性拷贝同时也会将值为 null 的属性拷贝,所以,这行代码放的位置很重要!
其他常用:
1 | Person p = new Person(new Book()); |
Codec
commons-codec
是 Apache 开源组织提供的用于摘要运算、编码的包。在该包中主要分为四类加密:BinaryEncoders、DigestEncoders、LanguageEncoders、NetworkEncoders。
最常用的类有两个:
- DigestUtils
主要包括 MD5、SHA1、SHA256 算法等实现静态方法 - Base64
主要包含 Base64 编码和解码静态方法
测试代码:
1 | public class CodecTest{ |
然后再补充一个 URL 的编码和解码:
1 |
|
Collections
对 Java 中的集合类进行了一定的补充,定义了一些全新的集合,当然也是实现了 Collection 接口的,比如Bag,BidiMap
。
同时拥有新版本的原有集合,比如 FastArrayList
。最后,更为重要的是一系列 utils 类,提供了我们常用的集合操作,可以大大方便我们的日常编程。
Bag
Bag 定义了一种集合:收集一个对象出现的次数。
例如 Bag:{a,a,b,c} 调用 bag.getCount(a)
返回 2,意味着里面有 2 个 a。 调用 bag.uniqueSet()
则返回一个 set,值为 {a,b,c}。
1 | // 例子 |
除了 HashBag,还有 SynchronizedBag、TreeBag,自行了解哈….
BidiMap
BidiMap 定义了一种 map,不仅可以通过 key 得到 value,还可以通过 value 得到 key。
Bidi 意思是 bidirectional,双向使用的 map。
除了传统 Map 的操作,还加入了一些新”技能“:
1 | BidiMap bidi = new DualHashBidiMap(); |
作为代价,BidiMap 必须要求 k 和 v 是一一对应的,在上述代码之后,无法做到 bidi.put("k2","v1");
,因为这样就无法实现响应操作。 现实中如学号和身份证号做对应就是这样一种关系,可以视情况使用。
同样,除了 DualHashBidiMap,还有 TreeBidiMap 等
有用的工具类
这是 collections 包中最有价值的一个部分,介绍 ListUtils
和 CollectionUtils
。
ListUtils 列表工具类
- ListUtils.intersection(list1, list2)
取交集; - ListUtils.subtract(list1, list2)
返回 list1 和 list2 的差。这里和list1.removeAll(list2)
的差别在于:
前者不改变任何一个集合;
如果 list1 中有 2 个 a,list2 中有一个a:removeAll 会将 list1 中所有的 a 都抹去,而 subtract 结果 list1 仍然会剩下一个 a。 - ListUtils.union(list1, list2)
取并集; - ListUtils.removeAll(list1, list2)
不改变 list 的情况下做 removeAll
CollectionUtils 通用的集合工具类
- CollectionUtils.union(c1, c2),CollectionUtils.intersection(c1,c2)
不再解释 - CollectionUtils.disjunction(c1, c2)
返回两者的不相交部分的并集,没想到一个现实场景。。 - CollectionUtils.containsAny(c1, c2)
只要 c1 包含任何一个 c2 的元素,返回 true - CollectionUtils.find(c, predicate)
重要方法:借助 Predicate 达到神一般的效果,从此减少一半 for 循环。返回第一个找到的元素 - CollectionUtils.filter(c, predicate)
重要方法:同上,直接改变容器 c。 - CollectionUtils.transform(c, transformer)
重要方法:还是神器,但是在 jdk8 中等同于 foreach 方法效果。如果 jdk<8,可以用这个方法代替 - CollectionUtils.countMatches(c,predicate)
根据 predicate 返回有多少元素满足预言,返回值 int。 - CollectionUtils.select(c,predicate)
根据 predicate 找出满足的元素,组成新的 collection 并返回 - CollectionUtils.select(c,predicate,outputCollection)
根据 predicate 找出满足的元素,加入到 outputCollection 中。 - CollectionUtils.isEmpty(c)
简单实用,是否为 null 或者空集合
补充:predicate
既然上面用到了还是说一说,感觉自从 JDK8 来了后,能省一大部分工具类了。。。
预言,这个类主要结合 CollectionUtils.find,CollectionUtils.filter
来使用。
他的作用类似于『断言』,其中只有一个方法:public boolean evaluate(Object object);
这个方法用于判断一个对象是否满足某种标准,感觉和 JDK8 中的 stream + map 差不多呢~
1 | // 一个例子 |
同时,Predicate 可以进行谓词连接,借助于:AndPredicate、OrPredicate、AnyPredicate、NotPredicate 这些类。
Long
提供了很多安全操作和工具类,避免我们编码校验各种的 null;
JDK8+ 后,对空值处理有了加强,但是嘛,国内用的人…..
- ArrayUtils:
数组工具类,提供数组拷贝、查找、反转等功能 - StringUtils:
提供字符串操作,对 null 是安全的,字符串查找、替换、分割、去空格等操作;
isEmpty 和 isBlank 的区别在于 isEmpty 不会忽略空格,而isBlank会认为是空,isBlank更常用 - ObjectUtils:
对 null 进行安全处理 - RandomUtils:
随机数工具类,获得随机整数、小数、字符串等 - NumberUtils:
数值工具类,数值类型转换等操作 - DateUtils:
日期工具类 - EnumUtils:
枚举工具类 - ClassUtils
判断是否有内部类、是否可以转型、获取包名、类名等 - ReflectionToStringBuilder/ToStringBuilder:
重写 toString 方法 - EqualsBuilder/HashCodeBuilder:
提供了方便的方法来覆盖 equals() 和 hashCode() 方法
然后给一些示例代码吧,比如 Builder 系列,虽然一般我们都是工具自动生成:
1 | //ToStringBuilder |
除了上面列举的,还有很多工具类,大部分也不说了,看一下方法基本就会用了,非常简单,看例子可去参考的第二个链接。
然后是日期,稍微提一下,也不常用:
1 | public class TestMain { |
IO
看名字也知道,这是用来操作文件的工具类,工具类包括 FileUtils、IOUtils、FilenameUtils 和 FileSystemUtils,前三者的方法并没有多大的区别,只是操作的对象不同;
故名思议:FileUtils 主要操作 File 类,IOUtils 主要操作 IO 流,FilenameUtils 则是操作文件名,FileSystemUtils 包含了一些 JDK 没有提供的用于访问文件系统的实用方法。当前,只有一个用于读取硬盘空余空间的方法可用。
果然还是例子最能说明问题:
1 | public class FileUtilsTest { |
最常用的还是刚上来工具类的那些,精简一下,最多的就是复制文件/文件夹:
1 | // 复制文件夹(文件夹里面的文件内容也会复制),file1和file2平级。 |
先暂时贴这么多吧,更多参考:https://blog.csdn.net/zhaoyanjun6/article/details/54972773
参考
https://www.jianshu.com/p/c3c3ab2bad8d
http://www.voidcn.com/article/p-ahnjkqaf-wo.html
https://blog.csdn.net/u011179993/article/details/46743521
评论框加载失败,无法访问 Disqus
你可能需要魔法上网~~