通用工具类(字符串、时间格式化、BeanUtils、IO)

1. commons-lang3库

1.1. org.apache.commons.lang3.StringUtils类

日常代码中,我们经常和String字符串打交道,经常对字符串进行处理,稍微不注意的话,很容易出现类似NullPointerException这种简单的错误,我们经常写各种if来判断处理这些非业务的逻辑。这时,我们可以利用大牛apache的轮子,通过其StringUtils里面的一些常用方法,改善我们的代码,让我们的业务代码更简洁、优雅。示例代码:

  @Slf4jpublic class AppTest {@Testpublic void stringUtils(){String a = "  ";String b = null;//判断字符对象是否为空以及内容是否为空串(有空格则认为不是空串)log.info("StringUtils.isEmpty(a): {}", StringUtils.isEmpty(a));//判断字符对象是否为空以及内容是否为空串(有空格也会认为是空串)log.info("StringUtils.isBlank(a): {}", StringUtils.isBlank(a));//当b=null时,如果b.trim()则会报空指针异常,使用StringUtils.trim(b)可以避免log.info("StringUtils.trim(d): {}", StringUtils.trim(b));String num = "12.3";//当b=null时,如果b.trim()则会报空指针异常,使用StringUtils.trim(b)可以避免log.info("org.apache.commons.lang3.StringUtils.isNumericSpace(): {} isNumber: {}", num, StringUtils.isNumericSpace(b));log.info("com.alibaba.druid.util.StringUtils.isNumber(): {} isNumber: {}", num, com.alibaba.druid.util.StringUtils.isNumber(num));}}复制代码
注意:common-lang3中的StringUtils. isNumeric()或isNumericSpace()并不能判断字符串中带小数点的数字值字符为数字。可以通过com.alibaba.druid.util.StringUtils.isNumber(str),此方法来判断。

1.2 org.apache.commons.lang3.time.DateFormatUtils/DateUtils

时间转换工具类:

      @Testpublic void dateFormatUtils() throws Exception{String pattern = "yyyy-MM-dd HH:mm:ss";String timeStr = DateFormatUtils.format(new Date(), pattern);long timestamp = DateUtils.parseDate(timeStr, pattern).getTime();log.info("==> current time: {}", timeStr);log.info("==> current time timestamp: {}", timestamp);}复制代码

总结

StringUtils.isEmpty(str)/StringUtils.isNotEmpty(str): 判断字符对象是否为null或空串(有空格则认为不是空串)

StringUtils.isBlank(str)/StringUtils.isNotBlank(str): 判断字符对象是否为null或空串(有空格也会认为是空串)

DateFormatUtils.format(date, pattern): 将Date时间对象按表达式的格式转换成时间字符串

DateUtils.parseDate(timeStr, pattern): 将时间字符串反转成Date对象

ToStringBuilder.reflectionToString(obj): 将对象内容转换成字符串输出(下一节有使用到)

...

对于学习某个工具类,我们可以通过Intellij IDEA中可通过打开此类的源代码,然后通过快捷键(MacOS: command+7; Windows: Alt+7)打开查看类方法列表(Structure),从方法名字上大概可以看出具体有那些适合自己使用的方法。

以上示例使用到的jar包可通过maven的pom.xml文件依赖导入:

          <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.8.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.9</version></dependency>复制代码

2.common-beanutils库

Map、JavaBean是我们日常业务代码中经常使用到的2种类,有时因为业务原因,Map、JavaBean需要相互转换copy啥的操作时,如果手动set/put,字段多的时候,就要吐血了。这里我们推荐使用BeanUtils来简化我们的代码

2.1.org.apache.commons.beanutils.BeanUtils类

      @Testpublic void beanUtils() throws InvocationTargetException, IllegalAccessException {CompanyBean bean = new CompanyBean();bean.setId(1);bean.setName("中国移动广州分公司");bean.setAddress("广州市天河区中山大道");bean.setTel("020-10086000");CompanyBean destObj = new CompanyBean();//复制bean之间复制内容, 新对象destObj需要先实例化BeanUtils.copyProperties(destObj, bean);//ToStringBuilder类来自commons-lang3库:将对象内容转换成字符串输出,方便于日志输出log.info("destObj from BeanUtils.copyProperties: {}", ToStringBuilder.reflectionToString(destObj));Map<String, Object> map = new HashMap<>();map.put("id", 2);map.put("name", "中国联通广州分公司");map.put("address", "广州市天河区中山大道2号");map.put("tel", "020-10000110");//将map(key,value)映射成beanBeanUtils.populate(destObj, map);log.info("destObj from BeanUtils.populate: {}",     ToStringBuilder.reflectionToString(destObj));//复制对象,与copyProperties()方法比较,这里新对象可以不先实例化CompanyBean cloneBean = (CompanyBean)BeanUtils.cloneBean(destObj);log.info("cloneBean from BeanUtils.cloneBean: {}", ToStringBuilder.reflectionToString(cloneBean));//将JavaBean转换成MapMap newMap = BeanUtils.describe(cloneBean);log.info("newMap from BeanUtils.describe: {}", new Gson().toJson(newMap));}复制代码

日志输出如下:

  2019-01-19 13:17:21.064 [main] INFO  com.monbuilder.AppTest - destObj from BeanUtils.copyProperties: com.monbuilder.bean.CompanyBean@10683d9d[id=1,name=中国移动广州分公司,address=广州市天河区中山大道1号,tel=020-10086000]2019-01-19 13:17:21.070 [main] INFO  com.monbuilder.AppTest - destObj from BeanUtils.populate: com.monbuilder.bean.CompanyBean@10683d9d[id=2,name=中国联通广州分公司,address=广州市天河区中山大道2号,tel=020-10000110]2019-01-19 13:48:14.966 [main] INFO  com.monbuilder.AppTest - newMap from BeanUtils.describe: {"address":"广州市天河区中山大道2号","name":"中国联通广州分公司","tel":"020-10000110","id":"2","class":"class com.monbuilder.bean.CompanyBean"}复制代码

总结

BeanUtils.copyProperties(destObj, sourceObj): JavaBean之间内容的复制

BeanUtils.cloneBean(obj): 复制对象

BeanUtils.populate(destObj, sourceMap): Map转换成JavaBean

BeanUtils.describe(bean): 将JavaBean转换成Map

3.commons-io库

org.apache.commons.io.IOUtils类

这个io工具类非常有用,当我们在处理流的过程中,经常需要把流与字节数组之间相互转换,以及在处理完之后,关闭流等等这些操作时,我们需要写挺多处理逻辑,close时还需要写if判空啥的,但是使用了这个IOUtil后,我们的处理代码或简洁非常多的。

      @Testpublic void ioUtils() throws IOException {InputStream io = this.getClass().getClassLoader().getResourceAsStream("README.md");BufferedReader br = new BufferedReader(new InputStreamReader(io));log.info("==> IOUtils.toString(br): {}", IOUtils.toString(br));IOUtils.closeQuietly(br);IOUtils.closeQuietly(io);}复制代码
  2019-01-19 14:29:26.140 [main] INFO  com.monbuilder.AppTest - ==> IOUtils.toString(br): toolkit-demo,工具类库使用示例复制代码
上面只是简单的展示将文件流内容转换成字符串,之后再关闭流,是不是非常简洁呢?IOUtils里面还有非常多的好方法可以使用,这些可以根据自己在具体的工作场景下,查看IOUtils的方法列表,找到自己需要的方法

总结

IOUtils常用的方法有:

IOUtils.closeQuietly(obj): 可关闭流\Socket\SocketServer等多种对象

IOUtils.copy(InputStream, Writer): 复制输入流

IOUtils.write(byte[], OutputStream): 将字节数组转换成流

IOUtils.toByteArray(InputStream): 将输入流转换成字节数组

IOUtils.toInputStream(String): 将字符串转换成输入流

IOUtils.toString(InputStream): 将输入流转换成字符串

上面介绍的都是来自于apache官方的类库,还有好多类与方法有待我们发掘使用。另外,还介绍另1个非常有名的工具类库:guava,来自于Google;功能也有类似的,当然也有很多的扩展使用,本文就不再详细介绍了。

          <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>23.2-jre</version></dependency>复制代码

JSON工具类

在如今REST API盛行的年代,前后端分离成为标配,json成为两者之间的传输桥梁,在我们工作做打交道肯定非常频繁咯。在Java开发中,JSON工具类的选择并不少:

fastjson 阿里巴巴出品,转换快,但表现不够稳定

Gson google出品,使用简单,轻量

Jackson spring官方使用,性能快,转换快,配置更灵活,不同场景下表现更稳定

比较推荐使用的是Jackson,如果我们使用Spring Boot或Spring Cloud时,构建web项目里面内置的json库就是Jackson库。

下面通过Jackson库简单封装成JavaBean/json互转的工具类:

  package com.monbuilder.util;import com.fasterxml.jackson.annotation.JsonInclude;import com.fasterxml.jackson.core.JsonParser;import com.fasterxml.jackson.databind.DeserializationFeature;import com.fasterxml.jackson.databind.ObjectMapper;import lombok.extern.slf4j.Slf4j;import java.text.SimpleDateFormat;/**** JSON转换工具类* @author <a href="mailto:lcbiao34@gmail.com">Builder34</a>* @date 2018-11-01 11:14:26* */@Slf4jpublic class JacksonUtil {private static ObjectMapper objectMapper = new ObjectMapper();static {objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);objectMapper.configure(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, true);objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));// 设置输入时忽略JSON字符串中存在而Java对象实际没有的属性objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);//设置不输出值为 null 的属性objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);}/*** 将JSON字符串根据指定的Class反序列化成Java对象(转换过程中出现异常则返回null对象)** @param json      JSON字符串* @param objClass JavaObject对象Class* @return 反序列化生成的Java对象* */public static <T> T toJavaObject(String json, Class<T> objClass) {try {return objectMapper.readValue(json, objClass);} catch (Exception e) {log.error("", e);return null;}}/*** 将Java对象序列化成JSON字符串(转换过程中出现异常则返回空对象json串"{}")** @param obj 待序列化生成JSON字符串的Java对象* @return JSON字符串*/public static String toJsonString(Object obj) {try {return objectMapper.writeValueAsString(obj);} catch (Exception e) {log.error("",e);}return "{}";}}复制代码

运用上面的工具类,示例:

    @Testpublic void jsonUtils(){CompanyBean bean = new CompanyBean();bean.setId(1);bean.setName("中国移动广州分公司");bean.setAddress("广州市天河区中山大道1号");bean.setTel("020-10086000");log.info("==>  JacksonUtil.toJsonString(bean): {}", JacksonUtil.toJsonString(bean));String json = JacksonUtil.toJsonString(bean);log.info("==>  JacksonUtil.toJavaObject: {}", ToStringBuilder.reflectionToString(JacksonUtil.toJavaObject(json, CompanyBean.class)));}复制代码
  2019-01-19 15:42:16.081 [main] INFO  com.monbuilder.AppTest - ==>  JacksonUtil.toJsonString(bean): {"id":1,"name":"中国移动广州分公司","address":"广州市天河区中山大道1号","tel":"020-10086000"}2019-01-19 15:42:16.144 [main] INFO  com.monbuilder.AppTest - ==>  JacksonUtil.toJavaObject: com.monbuilder.bean.CompanyBean@376a0d86[id=1,name=中国移动广州分公司,address=广州市天河区中山大道1号,tel=020-10086000]复制代码

上面涉及到的示例代码,皆可以通过打开Github地址[https://github.com/Builder34/toolkit-demo] 获取,或者点击阅读原文,跳转到代码库连接。

最后想要说的是,轮子非常多,当然我们可以重复造轮子,但是我们更提倡的是使用已有优秀的轮子(工具类),开发出更简洁、优雅、业务逻辑更清晰的代码。

                                                           -END-

扫描微信公众号关注一下,互相交流学习哟

转载于:https://juejin.im/post/5c43cc3bf265da6169178213

推荐使用的几款Java常用基础工具库相关推荐

  1. Java常用的工具有哪些?

    Java开发工具有很多,本篇就来给大家分享几个Java常用的工具! 1.Site24x7 使用Site24x7 APM Insight监控 Java 应用程序的性能. Site24x7 是一种基于 S ...

  2. 分享五款java学习辅助工具,总有你用的上的~

    想要学好java技术,除了自身的努力,辅助工具也不缺少,辅助工具可以帮助大家在今后的工作中可以提高工作效率,下面小编就来分享五款java学习辅助工具,总有你用的上的~ 五款java学习辅助工具: 1. ...

  3. 第二章 java常用开发工具以及程序的编写

    2019独角兽企业重金招聘Python工程师标准>>> 第二章 java常用开发工具以及程序的编写 1. 程序的概念         2. java程序的开发的三个步骤        ...

  4. Java常用开发工具介绍

    Java常用开发工具介绍 编辑器 记事本 Notepad++ EditPlus UltraEdit(UE) 其它文本编辑器 集成开发环境 JBuilder Eclipse NetBeans

  5. 细说Java主流日志工具库

    细说 Java 主流日志工具库 日志框架 java.util.logging (JUL) Log4j Logback Log4j2 Log4j vs Logback vs Log4j2 日志门面 co ...

  6. JAVA常用基础API(经典实例)

    API文档注释写法 实例: package apidoc; /*** 在类上面写文档注释,是用来说明当前类的设计目的.功能* @author ta* @version 1.0* @see java.l ...

  7. 后端:推荐九款Java 性能优化工具,你都用过吗?

    今天给大家一起看一下9个可以帮助我们优化Java性能的工具. 1.NetBeans Profiler NetBeans profiler是一个NetBeans IDE插件,主要为NetBeans ID ...

  8. Java常用基础知识点总结(最全)

    Java基础知识点总结 大纲 一.Java基础(语言.集合框架.OOP.设计模式等) 二.Java高级(JavaEE.框架.服务器.工具等) 三.多线程和并发 四.Java虚拟机 五.数据库(Sql. ...

  9. 强烈推荐的一款 Java 反编译工具:JAD

    01.JAD 是什么 JAD 是一款老牌的.经典的.使用起来简单的 Java 反编译工具.大家都知道,将源代码转换成二进制执行代码的过程叫"编译",比如将 Java 源代码编译成 ...

最新文章

  1. WPF 设置类库项目为启动项,设置窗体跟随。
  2. VTK:可视化之Opacity
  3. 备忘录模式 命令模式_备忘录设计模式示例
  4. cuda7.0安装(嵌入式)
  5. 如何杀掉可恶的Notkelvir病毒
  6. border做三角符号
  7. 使用python自动玩游戏
  8. js 微信小程序根据身份证号计算年龄
  9. kaggle电影数据分析报告
  10. 2018年深圳,武汉房价走势分析
  11. 微信小程序3-模板与配置
  12. 【华为机试真题 Python】一个正整数到 Excel 编号之间的转换
  13. 如何发送工资条通知短信
  14. 解析mindjump如何在线生成微信自动跳转第三方浏览器源码
  15. DevOps读书清单:十本应该放入书架的经典
  16. Java高并发编程 (马士兵老师视频)笔记(二)并发容器
  17. 新浪顶级架构师保驾护航!国内首本大型分布式架构笔记浴火新生
  18. b站课堂模式密码破解经历
  19. 利用VC++与MSXML解析XML文档
  20. T端带配置文件的魔兽世界BOSS被杀世界公告

热门文章

  1. 1月国内操作系统市场:Windows XP份额高达60.84%
  2. JAVE EE 企业级开发之从零开始学JAVA【51CTO技术论坛】
  3. IOS上传图片的方法
  4. mysql从另一张获取数据的方法
  5. 这次真的是下定决心了
  6. SSIS中的记录集目标
  7. Java多线程编程实战:模拟大量数据同步
  8. 折叠屏就要来了,适配逼死 Android 开发?
  9. struts2实验2:struts2.xml action中* ,{}以及${}
  10. ping命令工具:同时ping多个IP