github编辑

集合处理利器CollectionsUtil

在我们日常开发工作中, 大部分时间其实都是在和 JAVA集合框架打交道,对集合框架使用溜的话,会非常快捷,下面特别封装十分常用的方法

主要由下面8部分组成:

CollectionsUtil

1.辅助添加

方法
Description

addAllIgnoreNull(Collection, Iterable<? extends O>)

添加所有的Iterable元素到指定的objectCollection,如果 iterable是null将忽略.

addIgnoreNullOrEmpty(Collection, T)

添加 element元素到指定的objectCollection,如果 element 是null或者 empty将忽略.

1.1 addAllIgnoreNull(Collection, Iterable<? extends O>)

对于以下代码:

**可以重构成: **

重构之后,方法的复杂度会更小,阅读性更高

1.2 addIgnoreNullOrEmpty(Collection, T)

对于以下代码:

**可以重构成: **

重构之后,方法的复杂度会更小,阅读性更高

2.查找

方法
Description

find(Iterable, String, V)

找到 iterable中,第一个 propertyName属性名称值是 propertyValue 的对应元素.

find(Iterable, Predicate)

迭代查找匹配predicate 的第一个元素并返回.

2.1 find(Iterable, String, V)

比如以下代码:

22行代码,可以重构成

只需要14行代码,而且可阅读性更高

2.2 find(Iterable, Predicate)

场景: 从list中查找name是 关羽,并且 age等于30的User对象

返回:

3. 定位

方法
Description

indexOf(List, String, V)

在list中,查找第一个属性 propertyName 值是指定值 propertyValue 对象的索引位置.

示例:

说明:

  • 常用于浏览历史记录,当前的商品id是否在历史记录中第一条位置,如果是,可能就不会操作Cookie,诸如此类的操作

4. 查询

方法
Description

select(Collection, String, V...)

循环 objectCollection,获得元素 bean的 propertyName的值,判断是否在propertyValues 数组中;如果在,将该对象存入list中返回.

select(Collection, String, Collection)

循环 objectCollection,获得元素 bean 的propertyName的值,判断是否在propertyValueList 集合中;如果在,将该对象存入list中返回.

select(Collection, Predicate)

按照指定的 Predicate,返回查询出来的集合.

4.1 select(Collection, String, V...)

循环 objectCollection,获得元素 bean的 propertyName的值,判断是否在propertyValues 数组中;如果在,将该对象存入list中返回.

注意:

  • 查询的结果的顺序按照原来 objectCollection里面的顺序,和参数 propertyValues 无关,如果你需要结果里面的元素按照指定的propertyValues 顺序排序的话,可以将结果再调用SortUtil.sortListByFixedOrderPropertyValueArray(List, String, Object)

示例:

返回:

4.2 select(Collection, String, Collection)

循环 objectCollection,获得元素 bean 的propertyName的值,判断是否在propertyValueList 集合中;如果在,将该对象存入list中返回.

说明:

  • 查询的结果的顺序按照原来 objectCollection里面的顺序,和参数 propertyValueList 无关,如果你需要结果里面的元素按照指定的 propertyValueList顺序排序的话,可以将结果再调用SortUtil.sortListByFixedOrderPropertyValueList(List, String, List)

  • 和该方法正好相反的是 selectRejected(Collection, String, Collection)

示例: 场景: 查询 name属性是"张飞"或者是"刘备"的 User list

返回:

重构:

对于以下代码:

可以重构成:

4.3 select(Collection, Predicate)

按照指定的 Predicate,返回查询出来的集合.

说明:

  • 和该方法正好相反的是 selectRejected(Collection, Predicate)

示例1: 场景: 查找等于 1的元素

返回:

示例2: 场景: 查找大于 10的元素

返回:

5. 反查

方法
Description

selectRejected(Collection, String, V...)

循环 objectCollection,获得元素 bean 的 propertyName 属性值都不在 propertyValues 时候的list.

selectRejected(Collection, String, Collection)

循环 objectCollection,获得元素 bean 的 propertyName的值,判断是否不在propertyValueList 集合中;如果不在,将该对象存入list中返回.

selectRejected(Collection, Predicate)

循环 objectCollection,获得元素 bean,判断是否不匹配predicate,如果不匹配 ,将该对象存入list中返回.

5.1 selectRejected(Collection, String, V...)

循环 objectCollection,获得元素 bean 的 propertyName 属性值都不在 propertyValues 时候的list.

示例: 场景: 查询name 不是刘备 也不是张飞的 User list元素

返回:

5.2 selectRejected(Collection, String, Collection)

循环 objectCollection,获得元素 bean 的 propertyName的值,判断是否不在propertyValueList 集合中;如果不在,将该对象存入list中返回.

示例: 场景: 查询 name属性是不是"张飞",也不是"刘备"的 User list

返回:

5.3 selectRejected(Collection, Predicate)

循环 objectCollection,获得元素 bean,判断是否不匹配predicate,如果不匹配 ,将该对象存入list中返回.

说明:

  • 和该方法正好相反的是 select(Collection, Predicate)

示例: 场景: 从list中查找不等于1的元素

返回:

6. 提取

方法
Description

getPropertyValueList(Collection, String)

循环集合 objectCollection,取到对象指定的属性 propertyName的值,拼成List(ArrayList).

getPropertyValueSet(Collection, String)

解析迭代集合 objectCollection ,取到对象指定的属性 propertyName的值,拼成Set(LinkedHashSet).

getPropertyValueMap(Collection, String, String)

循环 objectCollection ,以 keyPropertyName属性值为key, valuePropertyName属性值为value,组成map返回.

6.1 getPropertyValueList(Collection, String)

循环集合 objectCollection,取到对象指定的属性 propertyName的值,拼成List(ArrayList).

示例:

场景: 获取user list每个元素的id属性值,组成新的list返回

返回:

6.2 getPropertyValueSet(Collection, String)

解析迭代集合 objectCollection ,取到对象指定的属性 propertyName的值,拼成Set(LinkedHashSet).

说明:

返回的是 LinkedHashSet,顺序是参数 objectCollection 元素的顺序

示例:

返回:

6.3 getPropertyValueMap(Collection, String, String)

循环 objectCollection ,以 keyPropertyName属性值为key, valuePropertyName属性值为value,组成map返回.

说明:

  • 返回的是 LinkedHashMap,顺序是参数 objectCollection 元素的顺序

  • 如果有元素 keyPropertyName属性值相同,那么后面的值会覆盖前面的值

示例:

返回:

如果有元素 keyPropertyName属性值相同,那么后面的值会覆盖前面的值

返回:

7. 分组

方法
Description

group(Collection, String)

循环 objectCollection,以 元素的 propertyName属性值为key,相同值的元素组成list作为value,封装成map返回.

group(Collection, String, Predicate)

循环 objectCollection,找到符合条件的 includePredicate的元素,以元素的 propertyName 属性值为key,相同值的元素组成list作为value,封装成map返回.

group(Collection, Transformer<O, T>)

循环 objectCollection,将元素使用keyTransformer转成key,相同值的元素组成list作为value,封装成map返回.

group(Collection, Predicate, Transformer<O, T>)

循环 objectCollection,找到符合条件的 includePredicate的元素,将元素使用keyTransformer转成key ,相同值的元素组成list作为value,封装成map返回.

groupOne(Collection, String)

循环 objectCollection,以元素的 propertyName属性值为key,元素为value,封装成map返回(map只put第一个匹配的元素,后面出现相同的元素将会忽略).

7.1 group(Collection, String)

循环 objectCollection,以 元素的 propertyName属性值为key,相同值的元素组成list作为value,封装成map返回.

说明:

  • 返回的LinkedHashMap,key是 objectCollection中的元素对象中 propertyName的值,value是objectCollection 中的元素对象;

  • 顺序是 objectCollection propertyName的值顺序,如果需要排序,可自行调用 SortUtil.sortMapByKeyAsc(Map), SortUtil.sortMapByKeyDesc(Map), SortUtil.sortMapByValueAsc(Map), SortUtil.sortMapByValueDesc(Map)或者, SortUtil.sortMap(Map, java.util.Comparator)

  • 属性propertyName值相同的元素,组成集合 list

  • 如果value只需要单值的话,可以调用 groupOne(Collection, String)方法

示例:

返回:

7.2 group(Collection, String, Predicate)

循环 objectCollection,找到符合条件的 includePredicate的元素,以元素的 propertyName 属性值为key,相同值的元素组成list作为value,封装成map返回.

说明:

  • 返回的LinkedHashMap,key是 objectCollection中的元素对象中 propertyName的值,value是objectCollection 中的元素对象;

  • 顺序是 objectCollection propertyName的值顺序,如果需要排序,可自行调用 SortUtil.sortMapByKeyAsc(Map), SortUtil.sortMapByKeyDesc(Map), SortUtil.sortMapByValueAsc(Map), SortUtil.sortMapByValueDesc(Map)或者, SortUtil.sortMap(Map, java.util.Comparator)

示例:

场景: 将age > 20的User,按照name 进行 group

返回:

当然,对于上述代码,你还可以优化成:

7.3 group(Collection, Transformer<O, T>)

循环 objectCollection,将元素使用keyTransformer转成key,相同值的元素组成list作为value,封装成map返回.

说明:

  • 返回的LinkedHashMap,key是 objectCollection中的元素 使用keyTransformer转换的值,value是 objectCollection中的元素对象(相同key值,组成list);

  • 返回的LinkedHashMap顺序,是 objectCollection 元素顺序,如果需要排序,可自行调用 SortUtil.sortMapByKeyAsc(Map), SortUtil.sortMapByKeyDesc(Map), SortUtil.sortMapByValueAsc(Map), SortUtil.sortMapByValueDesc(Map)或者, SortUtil.sortMap(Map, java.util.Comparator)

示例: 场景: 从user list中,提取user的姓名的姓为key,user组成list,返回map

返回:

7.4 group(Collection, Predicate, Transformer<O, T>)

循环 objectCollection,找到符合条件的 includePredicate的元素,将元素使用keyTransformer转成key ,相同值的元素组成list作为value,封装成map返回.

说明:

  • 返回的LinkedHashMap,key是 objectCollection中的元素 使用keyTransformer转换的值,value是 objectCollection中的元素对象(相同key值,组成list);

  • 返回的LinkedHashMap顺序,是 objectCollection 元素顺序,如果需要排序,可自行调用 SortUtil.sortMapByKeyAsc(Map), SortUtil.sortMapByKeyDesc(Map), SortUtil.sortMapByValueAsc(Map), SortUtil.sortMapByValueDesc(Map)或者, SortUtil.sortMap(Map, java.util.Comparator)

示例: 场景: 从user list中,提取 年龄 大于20的user,user的姓名的姓为key,user组成list,返回map

返回:

7.5 groupOne(Collection, String)

循环 objectCollection,以元素的 propertyName属性值为key,元素为value,封装成map返回(map只put第一个匹配的元素,后面出现相同的元素将会忽略).

说明:

  • 返回的LinkedHashMap,key是 objectCollection中的元素对象中 propertyName的值,value是 objectCollection中的元素对象;

  • 顺序是 objectCollection propertyName的值 顺序,如果需要排序,可自行调用 SortUtil.sortMapByKeyAsc(Map), SortUtil.sortMapByKeyDesc(Map), SortUtil.sortMapByValueAsc(Map), SortUtil.sortMapByValueDesc(Map)或者, SortUtil.sortMap(Map, java.util.Comparator)

  • 间接的可以做到基于某个属性值去重的效果

  • 如果value需要是集合的话,可以调用 group(Collection, String)方法

示例:

返回:

8.删除

方法
Description

remove(Collection, O)

从 objectCollection中 删除removeElement (原集合对象不变).

removeAll(Collection, Collection)

从 objectCollection中删除所有的 removeCollection (原集合对象不变).

removeDuplicate(Collection)

去重,返回没有重复元素的新list (原集合对象不变).

8.1 remove(Collection, O)

objectCollection中 删除removeElement (原集合对象不变).

说明:

  • 返回剩余的集合 (原集合对象不变),这个方法非常有用,如果你不想修改 collection的话,不能调用 collection.remove(removeElement);.

  • 底层实现是调用的 ListUtils.removeAll(Collection, Collection),将不是removeElement 的元素加入到新的list返回.

示例:

返回:

此时,原来的list不变:

**输出 : **

8.2 removeAll(Collection, Collection)

objectCollection中删除所有的 removeCollection (原集合对象不变).

说明:

  • 返回剩余的集合 (原集合对象objectCollection不变),如果你不想修改 objectCollection的话,不能直接调用 collection.removeAll(remove);,这个方法非常有用.

  • 底层实现是调用的 ListUtils.removeAll(Collection, Collection),将不是removeElement的元素加入到新的list返回.

示例: 场景: 从list中删除 "feilong2","feilong1"元素

返回:

8.3 removeDuplicate(Collection)

去重,返回没有重复元素的新list (原集合对象不变).

示例:

返回:

注意:

  • 如果原 objectCollection 是有序的,那么返回的结果参照原 objectCollection元素顺序

  • objectCollection不变

9.转换

方法
Description

collect(Iterable, Transformer<? super O, ? extends T>)

循环 inputIterable,将每个元素使用 transformer 转换成新的对象,返回新的list.

collect(Iterator, Transformer<? super O, ? extends T>)

循环 inputIterator,将每个元素使用 transformer 转换成新的对象 返回新的list.

collect(Iterable inputBeanIterable, Class outputListBeanType, String... includePropertyNames)

循环 inputBeanIterable,将每个元素使用转换程成新的 outputListBeanType 类型对象(如有需要只copy传入的includePropertyNames属性) 返回新的list..

9.1 collect(Iterable, Transformer<? super O, ? extends T>)

循环 inputIterable,将每个元素使用 transformer 转换成新的对象,返回新的list.

示例:

返回:

更多的,使用这个方法来处理两个不同类型的转换:

  • 比如购物车功能,有游客购物车CookieShoppingCartLine以及内存购物车对象 ShoppingCartLineCommand,两个数据结构部分元素相同,

  • 用户登陆需要把cookie中的购物车转成内存购物车ShoppingCartLineCommand list,这时我们可以先创建ToShoppingCartLineCommandTransformer

**代码示例: **

然后调用:

9.2 collect(Iterator, Transformer<? super O, ? extends T>)

循环 inputIterator,将每个元素使用 transformer 转换成新的对象,返回新的list.

示例:

场景: 一个简单的将list中的所有元素转成null

返回:

9.3 collect(Iterable inputBeanIterable, Class outputListBeanType, String... includePropertyNames)

循环 inputBeanIterable,将每个元素使用转换程成新的 outputListBeanType 类型对象(如有需要只copy传入的 includePropertyNames 属性) 返回新的 list.示例:已知有以下两个类 User 和 Customer public class User{ // The id. private Long id = 0L; //** The name. private String name = "feilong"; //** 年龄. private Integer age; //setter /getter public User(Long id, String name){ this.id = id; this.name = name; } } public class Customer{ //** The id. private long id; //* The name. private String name; //setter /getter }此时有以下的 List<User> 需要转换成 List<Customer> List<User> list = toList(// new User(23L, "张飞"), new User(24L, "关羽"), new User(25L, "刘备"));以前你需要如此这般写: List<Customer> customerList = new ArrayList<>(); for (User user : list){ Customer customer = new Customer(); customer.setId(user.getId()); customer.setName(user.getName()); customerList.add(customer); }如果属性很多,书写代码很繁琐此时你可以这么写: List<Customer> customerList = CollectionsUtil.collect(list, Customer.class);一行代码搞定集合转换问题如果你只想转换 id 属性,你可以: List<Customer> customerList = CollectionsUtil.collect(list, Customer.class,"id");说明:outputListBeanType 需要有默认的构造函数

最后更新于

这有帮助吗?