开发中遇到的问题&解决方案(四)

简介: 今天继续hutool工具类的认识,废话不多说下面直接进入主题。

微信截图_20220531133417.png

前言

今天继续hutool工具类的认识,废话不多说下面直接进入主题。

一.集合相关工具类,CollUtil,老规矩看类图知方法,接下来挑几个常用的进行讲解. 微信截图_20220531135927.png1.emptyIfNull类似collections.empty功能,这里就不多赘述 2.union,两个或三个集合的并集这个方法在一定程度上非常好用,看一下下来的例子就知道了,类似list的并集操作,但是list操作是listA.removeAll(listB),listA.addAll(listB)

ArrayList<String> list1 = CollUtil.newArrayList("1", "2", "3", "4");
ArrayList<String> list2 = CollUtil.newArrayList("2","5", "6");
Collection<String> union = CollUtil.union(list1, list2);
复制代码

输出结果:[1, 2, 3, 4, 5, 6] 扩展类unionDistinct是多个集合的非重复并集,实现代码很简单利用了LinkedHashSet元素不重复的特性,当然在实际开发中我们也可以仿照这种模式去编写适用于业务的工具类 3.intersection,两个集合的交集,list的操作是listA.retainAll(listB),下面看看intersection的操作,当然其扩展类也支持多个集合,而intersectionDistinct也是同类似的功能

public static <T> Collection<T> intersection(Collection<T> coll1, Collection<T> coll2) {
   if (isNotEmpty(coll1) && isNotEmpty(coll2)) {
      final ArrayList<T> list = new ArrayList<>(Math.min(coll1.size(), coll2.size()));
      //countMap的作用是根据集合返回一个元素计数的Map
      final Map<T, Integer> map1 = countMap(coll1);
      final Map<T, Integer> map2 = countMap(coll2);
      final Set<T> elts = newHashSet(coll2);
      int m;
      //循环上面的set找两个Map中最小的数字然后放入list中,最后返回list
      for (T t : elts) {
         m = Math.min(Convert.toInt(map1.get(t), 0), Convert.toInt(map2.get(t), 0));
         for (int i = 0; i < m; i++) {
            list.add(t);
         }
      }
      return list;
   }
   return new ArrayList<>();
}
复制代码

4.disjunction,两个集合的差集,list里相对简单,使用removeAll就能实现,我们再来看看disjunction的操作

public static <T> Collection<T> disjunction(Collection<T> coll1, Collection<T> coll2) {
   if (isEmpty(coll1)) {
      return coll2;
   }
   if (isEmpty(coll2)) {
      return coll1;
   }
   final List<T> result = new ArrayList<>();
   //同样根据集合的size创建size个元素的Map
   final Map<T, Integer> map1 = countMap(coll1);
   final Map<T, Integer> map2 = countMap(coll2);
   final Set<T> elts = newHashSet(coll2);
   elts.addAll(coll1);
   int m;
   //循环上面的list 相互比较,把相差的个数记录,返回两个map中除去元素值相同的元素保留不一样的元素
   for (T t : elts) {
      m = Math.abs(Convert.toInt(map1.get(t), 0) - Convert.toInt(map2.get(t), 0));
      for (int i = 0; i < m; i++) {
         result.add(t);
      }
   }
   return result;
}
复制代码

5.subtract,计算集合的单差集,即返回集合1中有集合2无的元素,代码如下:

public static <T> Collection<T> subtract(Collection<T> coll1, Collection<T> coll2) {
        //先克隆集合1
   Collection<T> result = ObjectUtil.clone(coll1);
   //如果集合1无元素则创建一个空的集合1
   if (null == result) {
      result = CollUtil.create(coll1.getClass());
      result.addAll(coll1);
   }
   //从集合1中剔除掉集合2的元素
   result.removeAll(coll2);
   return result;
}
复制代码

小结

hutool的工具类有很多类似之处,看着代码很简单但是很实用,我们在平常的开发中也可以借鉴,写属于自己的工具类,加油。

目录
相关文章
|
数据安全/隐私保护
开发中遇到的问题&解决方案(五)
在开发过程中,图片是必不可少的,除了图片的上传下载以外,图片压缩也是很常见的。 下面我们来看看hutool工具类里图片压缩的方法。
382 0
开发中遇到的问题&解决方案(五)
|
网络协议 数据安全/隐私保护
开发中遇到的问题&解决方案(七)
邮件发送相信大家都不陌生吧,一般是用于电商平台比如京东下单后订单信息的邮件发送或者移动这种的月度账单的邮件发送,再有就是通过绑定的邮箱进行密码重置,由邮箱跳转到指定的密码重置页进行密码重置操作。那么下面我们来看看hutool里对于邮件发送的包装是怎么样的。
209 0
开发中遇到的问题&解决方案(七)
|
Java 数据库 微服务
开发中遇到的问题&解决方案(三)
我们在日常的开发中会使用到很多工具类,比如最常用的Http请求的,或者日期工具类,处理时间差或者对日期进行特殊处理的,还有就是图片上传类的,比如阿里云或者腾讯云得SSO图片上传,以及Excel文件的导入导出。那这些工具类基本上都是跟着项目的,就是每个项目都写各自的工具类,如果分工明确细化到小组那重复代码就多了,那把工具类集成成一个项目类呢,由一个人去维护这个工具类工程,如果是微服务项目就是一个工具类的微服务,这样做的好处就很明显了,至少公司的研发部在使用到常用的工具类时不必再去网上找到。
329 0
开发中遇到的问题&解决方案(三)
|
设计模式 前端开发 Java
开发中遇到的问题&解决方案(一)
在开发过程在我们往往会遇到很多的开发阻碍或者因为原生框架的不支持导致的一系列问题或者有的不是问题,是我们使用普通的大量的复制粘贴改改就能用的代码去实现功能,这样使得代码很冗余,我们能不能去尝试找一些好的方案比如采用设计模式这些去优化我们的代码,实现代码简洁明了,易扩展呢?答案是肯定的。这个系列文章会使用案列加解决方案的形式为大家讲解,那下面我们开始吧。
760 0
开发中遇到的问题&解决方案(一)
|
JSON 自然语言处理 Java
开发中遇到的问题&解决方案(十)
我们在开发中一般遇到会对于敏感词的过滤或者屏蔽,因为之前做过社区类的APP,在这方面也踩了不少的坑,算是也积累了一点点的经验,那么今天我们来看看hutool里对于敏感词的一些操作,工具类SensitiveUtil()
405 0
开发中遇到的问题&解决方案(十)
|
Java Linux 数据安全/隐私保护
开发中遇到的问题&解决方案(六)
之前的项目里有用到FTP,需要使用FTP把图片及一些必要文件上传到第三方的FTP服务器上,所以会涉及FTP连接,创建用户,创建文件夹,文件上传等,项目里选用的还是hutool包装的FTP工具类,下面来看看这些功能的在hutool里是怎么包装的。
547 0
开发中遇到的问题&解决方案(六)
|
Java
开发中遇到的问题&解决方案(八)
以前的一个老项目里使用过ZXing进行会员和门店二维码的生成操作,当时出现过Java版本升级后不兼容的问题,很是麻烦,于是替换成了hutool里的二维码生成,下面我们来看看具体的实现。
206 0
开发中遇到的问题&解决方案(八)
|
SQL NoSQL Oracle
开发中遇到的问题&解决方案(二)
一个软件系统最重要的是什么?毫无疑问是数据,那什么是数据的&#39;运载体&#39;,什么作为后端与数据库的桥梁和沟通者呢,是SQL。我是Java开发出身,大学课程当时学习的是SQL Server,而且后面工作中实际用到过Oracle,DB2以及使用的最普遍的My SQL,至于No SQL 这一类下的常用的就是Redis和MongoDB了,这些后面再详细举例说明。今天讲的案列与表情相关,那么接下来进入今天的主题。
176 0
开发中遇到的问题&解决方案(二)
|
安全 机器人 数据安全/隐私保护
开发中遇到的问题&解决方案(九)
在我们的系统里验证码是必不可少的,比如注册登录时,忘记密码时,设置支付密码时或者支付下单时,那验证码的作用在哪里呢?其实就一条为了防止来着黑客和机器人恶意的攻击,那么下面我们来看看hutool里验证码工具类。
273 0
开发中遇到的问题&解决方案(九)
做项目遇到的问题以及解决方案
做项目遇到的问题以及解决方案
425 0
做项目遇到的问题以及解决方案