龙空技术网

java 中节省 90% 时间的常有的工具类

程序那点事 2408

前言:

眼前同学们对“attr和css”都比较关注,姐妹们都想要分析一些“attr和css”的相关文章。那么小编也在网上网罗了一些关于“attr和css””的相关文章,希望同学们能喜欢,兄弟们快快来了解一下吧!

下面一起来看看可以节省 90% 的加班时间的第三方开源库吧。第一个介绍的必须是 Apache 下的 Commons 库,第二个是 google 开源的 Guava 库, 第三个是Hutool工具类库

Apache Commons

Apache Commons 是一个功能非常强大、经常被使用到的库。它有 40 个左右的类库,包含了对字符串、日期、数组等的操作。

Lang3

Lang3 是一个处理 Java 中基本对象的包,比如用 StringUtils 类操作字符串、ArrayUtils 类操作数组、DateUtils 类可以处理日期、MutablePair 类可以返回多个字段等等。

字符串操作

对字符串快速操作,在 if else 的少写判空条件。

123456789
StringUtils.isBlank(" "); //是不是空字符串StringUtils.isAnyBlank("a", "", "c"); // 其中一个是不是空字符串StringUtils.isNumeric("1"); //字符串是不是全是数字组成,"." 不算数字StringUtils.remove("sgsgsdfasd", "a") //移除字符串
日期操作

终于可以不用 SimpleDateFormat 格式化日期了,DateUtils.iterator 可以获取一段时间。

1234567891011121314151617181920
Date date = DateUtils.parseDate("2021-07-01", "yyyy-MM-dd");DateUtils.addDays(date,1);//加一天DateUtils.isSameDay(date, new Date());//比较/*获取一段日期RANGE_WEEK_SUNDAY 从周日开始获取一周日期RANGE_WEEK_MONDAY 从周一开始获取一周日期RANGE_WEEK_RELATIVE 从当前时间开始获取一周日期RANGE_WEEK_CENTER 以当前日期为中心获取一周日期RANGE_MONTH_SUNDAY 从周日开始获取一个月日期RANGE_MONTH_MONDAY 从周一开始获取一个月日期*/Iterator<Calendar> iterator = DateUtils.iterator(date, DateUtils.RANGE_WEEK_CENTER);while (iterator.hasNext()) {    Calendar next = iterator.next();    System.out.println(DateFormatUtils.format(next, "yyyy-MM-dd"));}
返回多个字段

有时候在一个方法中需要返回多个值的时候,经常会使用 HashMap 返回或者是 JSON 返回。Lang3 下已经帮我们提供了这样的工具类,不需要再多写 HashMap 和 JSON 了。

12345
MutablePair<Integer, String> mutablePair = MutablePair.of(2, "这是两个值");System.out.println(mutablePair.getLeft() + "  " + mutablePair.getRight());MutableTriple<Integer, String, Date> mutableTriple = MutableTriple.of(2, "这是三个值", new Date());System.out.println(mutableTriple.getLeft() + " " + mutableTriple.getMiddle() + " " + mutableTriple.getRight());
ArrayUtils 数组操作

ArrayUtils 是专门处理数组的类,可以让方便的处理数组而不是需要各种循环操作。

123456789101112131415161718192021222324
//合并数组String[] array1 = new String[]{"value1", "value2"};String[] array2 = new String[]{"value3", "value4"};String[] array3 = ArrayUtils.addAll(array1, array2);//clone 数组String[] array4 = ArrayUtils.clone(array3);//数组是否相同EqualsBuilder.reflectionEquals(array3, array4);//toString ArrayUtils.toString(array4)//反转数组ArrayUtils.reverse(array4);//二维数组转 mapMap<String, String> arrayMap = (HashMap)ArrayUtils.toMap(new String[][]{    {"key1", "value1"}, {"key2", "value2"}});for(String s : arrayMap.keySet()) {    System.out.println(arrayMap.get(s));}
collections4 集合操作

commons-collections4 增强了 Java 集合框架,提供了一系列简单的 API 方便操作集合。

maven 依赖

12345
<dependency>      <groupId>org.apache.commons</groupId>      <artifactId>commons-collections4</artifactId>      <version>4.4</version>  </dependency>  
CollectionUtils 工具类

这是一个工具类,可以检查 null 元素不被加入集合,合并列表,过滤列表,两个列表的并集、差集、合集。有部分功能在 Java 8 中可以被 Stream API 替换。

1234567891011121314151617181920212223242526272829303132
//null 元素不能加进去List<String> arrayList1 = new ArrayList<String>();arrayList1.add("a");CollectionUtils.addIgnoreNull(arrayList1, null);System.out.println(arrayList1.size());//排好序的集合,合并后还是排序的List<String> arrayList2 = new ArrayList<String>();List<String> arrayList3 = new ArrayList<String>();List<String> arrayList4 = CollectionUtils.collate(arrayList2, arrayList3);System.out.println(arrayList4);// 过滤,只保留 bCollectionUtils.filter(arrayList4, new Predicate<String>() {    public boolean evaluate(String s) {        if( s.equals("b")) {            return true;        }        return false;    }});//交集CollectionUtils.retainAll(arrayList4, arrayList3);//并集CollectionUtils.union(arrayList4, arrayList3//差集CollectionUtils.subtract(arrayList4, arrayList3)
Bag 统计次数

用于统计值在集合中出现的次数。

123456
Bag bag = new HashBag<String>();bag.add("a");bag.add("b");bag.add("a");bag.add("c", 3);System.out.println(bag.getCount("a"));
beanutils Bean 操作

beanutils 是通过反射机制对 JavaBean 进行操作的。比如对 Bean 进行复制、map 转对象、对象转 Map。

maven 依赖

12345
<dependency>    <groupId>commons-beanutils</groupId>    <artifactId>commons-beanutils</artifactId>    <version>1.9.4</version></dependency>
123456789101112131415161718192021
//Beanpublic class User {    private String name;    //省略get/set}//copy BeanUser user1 = new User();user1.setName("李四");User user2 = (User) BeanUtils.cloneBean(user1);System.out.println(user2.getName());//Bean 转 mapBeanUtils.describe(user1);//Map 转 BeanMap<String, String> beanMap = new HashMap();beanMap.put("name", "张三");User user3 = new User();BeanUtils.populate(user3, beanMap);System.out.println(user3.getName());
Guava

Google 开源的一个基于 Java 扩展项目,包含了一些基本工具、集合扩展、缓存、并发工具包、字符串处理等。

maven 依赖

12345
<dependency>  <groupId>com.google.guava</groupId>  <artifactId>guava</artifactId>  <version>30.1.1-jre</version></dependency>
Map<String, List> 类型

在java 代码中经常会遇到需要写 Map<String, List> map 的局部变量的时候。有时候业务情况还会更复杂一点。

12345678910111213
//以前Map<String, List<String>> map = new HashMap<String,List<String>>();List<String> list = new ArrayList<String>();list.add("张三");list.add("李四");map.put("名称", list);System.out.println(map.get("名称"));//现在Multimap<String, String> multimap = ArrayListMultimap.create();multimap.put("名称", "张三");multimap.put("名称", "李四");System.out.println(multimap.get("名称"));
value 不能重复的 Map

在 Map 中 value 的值时可以重复的,Guava 可以创建一个 value 不可重复的 Map,并且 Map 和 value 可以对调。

123456789
//会报异常BiMap<String ,String> biMap = HashBiMap.create();biMap.put("key1", "value");biMap.put("key2", "value");System.out.println(biMap.get("key1"));//key-value 对调biMap = biMap.inverse();System.out.println(biMap.get("value"));
缓存

写业务的时候肯定会使用缓存,当不想用第三方作为缓存的时候,Map 又不够强大,就可以使用 Guava 的缓存。

使用 CacheBuilder.newBuilder().build() 构建缓存,maximumSize() 方法可以设置缓存的存储数量

12345
Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(2).build();cache.put("key1", "value1");cache.put("key2", "value2");cache.put("key3", "value3");System.out.println(cache.getIfPresent("key1")); //key1 = null
过期时间

expireAfterAccess() 可以设置缓存的过期时间。

1234
Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(2).expireAfterAccess(1, TimeUnit.SECONDS).build();cache.put("key1", "value1");Thread.sleep(1000);System.out.println(cache.getIfPresent("key1"));
加载数据

当需要访问 key1 时,如果 key1 此时没有被缓存,就会从回调函数中加载 key1 的值。值得一提的时当多个线程同时访问的时候只有一个线程会执行回调函数。

123456
 cache.get("key1", new Callable<String>() {    public String call() throws Exception {        return "value1";    }});System.out.println(cache.getIfPresent("key1"));

Guava 有许许多多的工具类,这里只列出了小小的部分,可以在官网例子中查看到各种用法。

Hutool

一个Java基础工具类,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类,同时提供以下组件:

hutool-aop JDK动态代理封装,提供非IOC下的切面支持hutool-bloomFilter 布隆过滤,提供一些Hash算法的布隆过滤hutool-cache 缓存hutool-core 核心,包括Bean操作、日期、各种Util等hutool-cron 定时任务模块,提供类Crontab表达式的定时任务hutool-crypto 加密解密模块hutool-db JDBC封装后的数据操作,基于ActiveRecord思想hutool-dfa 基于DFA模型的多关键字查找hutool-extra 扩展模块,对第三方封装(模板引擎、邮件等)hutool-http 基于HttpUrlConnection的Http客户端封装hutool-log 自动识别日志实现的日志门面hutool-script 脚本执行封装,例如Javascripthutool-setting 功能更强大的Setting配置文件和Properties封装hutool-system 系统参数调用封装(JVM信息等)hutool-json JSON实现hutool-captcha 图片验证码实现SecureUtil(加密解密工具)

主要是在登录的时候还有修改密码的时候用到的,因为数据库里面的密码是md5加密处理的,所以登录的时候需要先加密之后再到数据库进行查询,使用Hutool的话,只需要调用SecureUtil中的md5方法就可以了。

user = userService.userLoginByName(loginName,SecureUtil.md5(loginPwd));
HtmlUtil(HTML工具类)

这个工具类就比较厉害了,不过我在Halo当中用得最多的还是HtmlUtil.encode,可以将一些字符转化为安全字符,防止xss注入和SQL注入,比如下面的评论提交。

comment.setCommentAuthor(HtmlUtil.encode(comment.getCommentAuthor()));

这就是防止有小坏蛋故意写一些可执行的js代码,然后提交评论,在后台面板就会执行这一段代码,比较危险,使用encode方法就可以将

就可以将<script>标签给转化成<script>,这样转化之后,js代码就不会执行了。

另外,HtmlUtil还提供了以下方法,有兴趣的可以去试一下。

HtmlUtil.restoreEscaped 还原被转义的HTML特殊字符HtmlUtil.encode 转义文本中的HTML字符为安全的字符HtmlUtil.cleanHtmlTag 清除所有HTML标签HtmlUtil.removeHtmlTag 清除指定HTML标签和被标签包围的内容HtmlUtil.unwrapHtmlTag 清除指定HTML标签,不包括内容HtmlUtil.removeHtmlAttr 去除HTML标签中的属性HtmlUtil.removeAllHtmlAttr 去除指定标签的所有属性HtmlUtil.filter 过滤HTML文本,防止XSS攻击

CronUtil(定时任务)

这个工具就更厉害了,完全不需要类似quartz这样的框架来做定时任务,而且CronUtil也不需要任何其他依赖,只需要在resources下建一个配置文件,然后在程序启动的时候将定时任务开启就行了,如Halo的定时备份功能(每天凌晨1点备份一次)。

cron.setting:

cc.ryanc.halo.web.controller.admin.BackupController.backupResources = 0 0 1 * * ?cc.ryanc.halo.web.controller.admin.BackupController.backupDatabase = 0 0 1 * * ?cc.ryanc.halo.web.controller.admin.BackupController.backupPosts = 0 0 1 * * ?
@Overridepublic void onApplicationEvent(ContextRefreshedEvent event){	this.loadActiveTheme();	this.loadOptions();	this.loadFiles();	this.loadThemes();	//启动定时任务	CronUtil.start();	log.info("定时任务启动成功!");}

具体使用方法请看文档

好了,就介绍这三个工具类,有兴趣的可以去试试其他的工具,挺全的,这应该是我用过最好用的一个工具类库了,值得一试。

官网地址:

总结

通过 Apache Commons 和 Guava 两个第三方的开源工具库,可以让减少循环、ifelse 的代码。写出的代码更有健壮性并且可以在新人面前装一波。

标签: #attr和css