Springboot内置的工具类之CollectionUtils示例讲解
作者:凡夫贩夫 发布时间:2023-08-23 20:47:13
前言
实际业务开发中,集合的判断和操作也是经常用到的,Spring也针对集合的判断和操作封装了一些方法,但是最令我惊讶的是,我在梳理这些内容的过程中发现了一些有趣的现象,我的第一反应是不敢相信,再想一想,没错,我是对的。所以强烈建议大家可以认真看完这篇文章,这一篇绝对有价值,因为有趣的是我我竟然发现了Spring的两个bug。
org.springframework.util.CollectionUtils
集合的判断
boolean hasUniqueObject(Collection collection)
从源码注释上看,是用于判断 List/Set 中的每个元素是否唯一,即 List/Set 中不存在重复元素。但这里要告诉大家千万不要用这个方法,因为这个方法有bug,为什么呢?下面是Spring-core-5.2.13.RELEASE.jar中的源码,且看12行,细心的人会发现两个对象之间比较是否相等用的是!=。还记得“==”和“equals”的区别吗?“==”操作符专门用来比较两个变量的值是否相等,equals()方法是用于比较两个独立对象的内容是否相同。所以这里如果集合中的元素是数值,可以用“==”比较,如果是普通的引用对象,就得不到正确的结果了。
public static boolean hasUniqueObject(Collection<?> collection) {
if (isEmpty(collection)) {
return false;
}
boolean hasCandidate = false;
Object candidate = null;
for (Object elem : collection) {
if (!hasCandidate) {
hasCandidate = true;
candidate = elem;
}
else if (candidate != elem) {
return false;
}
}
return true;
}
boolean containsInstance(Collection collection, Object element)
从源码的注释上看,是用于判断集合中是否包含某个对象。这个方法也不建议使用,因为与上一个方法存在相同的问题,且看源码的第4行,依然用的是“==”。
public static boolean containsInstance(@Nullable Collection<?> collection, Object element) {
if (collection != null) {
for (Object candidate : collection) {
if (candidate == element) {
return true;
}
}
}
return false;
}
boolean isEmpty(Collection collection)
这个方法已验证过可以放心用,用于判断 List/Set 是否为空;
@Test
public void test1(){
Collection<String> list=new ArrayList<>();
boolean empty = CollectionUtils.isEmpty(list);
Assert.isTrue(empty, "集合list不为空");
System.out.println("集合list增加一元素");
list.add("happy");
boolean empty2 = CollectionUtils.isEmpty(list);
Assert.isTrue(empty2, "集合list不为空");
}
boolean isEmpty(Map map)
用于判断 Map 是否为空。
@Test
public void test2(){
Map<String,String> map = new HashMap<>();
boolean empty = CollectionUtils.isEmpty(map);
Assert.isTrue(empty, "map不为空");
System.out.println("map中增加元素");
map.put("name", "jack");
boolean empty2 = CollectionUtils.isEmpty(map);
Assert.isTrue(empty2, "map不为空");
}
boolean containsAny(Collection source, Collection candidates)
从源码上的注释看,是用于判断集合source中是否包含另一个集合candidates的任意一个元素,即集合candidates中的元素是否完全包含于集合soruce。
从源码这个方法中的元素之间的比较用到了“equals”方法,且调用的是集合内对象的equals方法,因此使用这个方法想要得到正确的结果的前提是,比较的对象要重写hashCode()和eauals()方法。
@Test
public void test4(){
Employee lisi = new Employee("lisi");
Employee zhangsan = new Employee("zhangsan");
Employee wangwu = new Employee("wangwu");
List<Employee > list=new ArrayList<>();
list.add(zhangsan);
list.add(lisi);
List<Employee> list2=new ArrayList<>();
list2.add(wangwu);
//这里可以用是因为比较的时候调用的是equals方法
boolean b = CollectionUtils.containsAny(list, list2);
Assert.isTrue(b, "list1没有包含有list2中任意一个元素");
}
集合的操作
void mergeArrayIntoCollection(Object array, Collection collection)
将数组array中的元素都添加到 List/Set 中。
@Test
public void test6(){
List<Employee > list=new ArrayList<>();
Employee lisi = new Employee("lisi");
list.add(lisi);
Employee zhangsan = new Employee("zhangsan");
Employee[] employees={zhangsan};
CollectionUtils.mergeArrayIntoCollection(employees, list);
Assert.isTrue(list.size()==2, "把数据中的元素合并到list失败了");
}
void mergePropertiesIntoMap(Properties props, Map map)
将 Properties 中的键值对都添加到 Map 中。
@Test
public void test7(){
Properties properties = new Properties();
properties.setProperty("name", "zhangsan");
Map<String,String > map = new HashMap<>();
CollectionUtils.mergePropertiesIntoMap(properties, map);
Assert.isTrue(map.get("name").equals("zhangsan"), "把properties中的元素合并到map中失败了");
}
@Test
public void test7(){
Properties properties = new Properties();
properties.setProperty("name", "zhangsan");
Map<String,String > map = new HashMap<>();
CollectionUtils.mergePropertiesIntoMap(properties, map);
Assert.isTrue(map.get("name").equals("zhangsan"), "把properties中的元素合并到map中失败了");
}
T lastElement(List list)
返回 List 中最后一个元素。
@Test
public void test9(){
Employee lisi = new Employee("lisi");
Employee zhangsan = new Employee("zhangsan");
List<Employee > list=new ArrayList<>();
list.add(zhangsan);
list.add(lisi);
Employee employee = CollectionUtils.firstElement(list);
Assert.isTrue(employee.equals(zhangsan), "获取集合第一个元素失败了");
}
T firstElement(List list)
返回集合中第一个元素。
@Test
public void test10(){
Employee zhangsan = new Employee("zhangsan");
Employee[] employees={zhangsan};
List list = CollectionUtils.arrayToList(employees);
Assert.isTrue(list.size()==1, "把数据转换成集合失败了");
}
List arrayToList(Object source)
把一个数组转换成一个集合。
@Test
public void test10(){
Employee zhangsan = new Employee("zhangsan");
Employee[] employees={zhangsan};
List list = CollectionUtils.arrayToList(employees);
Assert.isTrue(list.size()==1, "把数据转换成集合失败了");
}
来源:https://blog.csdn.net/fox9916/article/details/128321098
猜你喜欢
- 简介Android给我们提供了一种轻量级的异步任务类AsyncTask。该类中实现异步操作,并提供接口反馈当前异步执行结果及进度,这些接口中
- 对Jpa Entity关系映射中mappedBy的理解mappedBy 单向关系不需要设置该属性,双向关系必须设置,避免双方都建立外键字段数
- 本文实例讲述了C++实现的O(n)复杂度内查找第K大数算法。分享给大家供大家参考,具体如下:题目:是在一组数组(数组元素为整数,可正可负可为
- 本文实例讲述了Java简单验证身份证功能。分享给大家供大家参考,具体如下:package org.cxy.csdn.example;impo
- 一、写在前面数据结构中的队列应该是比较熟悉的了,就是先进先出,因为有序故得名队列,就如同排队嘛,在对尾插入新的节点,在对首删除节点.jdk集
- 前言当系统的并发比较高的时候,日志的处理输出也是一种性能的开销负担,所以,选择一个中间件来处理消费日志必不可少!下面是spring boot
- 要想实现android手机通过扫描名片,得到名片信息,可以使用脉可寻提供的第三方SDK,即Maketion ScanCard SDK,脉可寻
- 一、介绍在实际的软件项目开发过程中,我可以很负责任的跟大家说,如果你真的实际写代码的时间超过5年,你对增删改查这类简单的功能需求开发,可以说
- maven配置项目的jdk版本无效排查最近在配置项目的jdk的时候发现在pom.xml中配置的1.8版本无效,maven更新后就变成了1.7
- 本篇分享的是springboot多数据源配置,在从springboot v1.5版本升级到v2.0.3时,发现之前写的多数据源的方式不可用了
- 1. 什么是对象池对象池,顾名思义就是一定数量的已经创建好的对象(Object)的集合。当需要创建对象时,先在池子中获取,如果池子中没有符合
- 首先当我们将Dwr3配置好以后,我们可以在浏览器中测试一下,查看一下我们配置的Dwr有没有生效,方法是http://localhost:[你
- 本文实例为大家分享了Android TextView实现跑马灯效果的具体代码,供大家参考,具体内容如下当Layout中只有一个TextVie
- java 读取本地文件实例详解用javax.xml、w3c解析实例代码:package cn.com.xinli.monitor.utils
- 本文实例为大家分享了Android实现支付宝支付密码输入界面的具体代码,供大家参考,具体内容如下效果图:主要代码:import java.u
- 在我们实现某些功能时,可能会有倒计时的需求。比如发送短信验证码,发送成功后可能要求用户一段时间内不能再次发送,这时候我们就需要进行倒计时,时
- 前言我们一说到spring,可能第一个想到的是 IOC(控制反转) 和 AOP(面向切面编程)。没错,它们是spring的基石,得益于它们的
- 本文实例为大家分享了OpenCV实现直线检测并消除的具体代码,供大家参考,具体内容如下很简单,代码如下#include<iostrea
- 1 SharedPreferences 介绍SharedPreferences是使用键值对的方式来存储数据的SharedPreference
- 这篇会深化View拖拽实例,利用Flutter Animation、插值器以及AnimatedBuilder教大家实现带动画的抽屉效果。先来