Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.gitee.apanlh.util.base.CollUtils Maven / Gradle / Ivy
package com.gitee.apanlh.util.base;
import com.gitee.apanlh.util.base.enums.CalculationTypeEnum;
import com.gitee.apanlh.util.base.enums.Sort;
import com.gitee.apanlh.util.date.DateUtils;
import com.gitee.apanlh.util.func.FuncCollectionExecute;
import com.gitee.apanlh.util.func.FuncFilter;
import com.gitee.apanlh.util.func.FuncFind;
import com.gitee.apanlh.util.func.FuncFindCall;
import com.gitee.apanlh.util.func.FuncGet;
import com.gitee.apanlh.util.func.FuncGroupBy;
import com.gitee.apanlh.util.func.FuncIteratorResultE;
import com.gitee.apanlh.util.func.FuncPage;
import com.gitee.apanlh.util.reflection.ClassTypeUtils;
import com.gitee.apanlh.util.reflection.ClassUtils;
import com.gitee.apanlh.util.reflection.ReflectionUtils;
import com.gitee.apanlh.util.valid.ValidParam;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
/**
* 集合工具类
*
* @author Pan
*/
public class CollUtils {
/**
* 构造函数
*
* @author Pan
*/
private CollUtils() {
// 不允许外部实例
super();
}
/**
* 添加元素(集合)
* 将集合2添加值集合1中
*
* @author Pan
* @param 元素
* @param list 集合
* @param list2 集合2
* @return List
*/
public static List addAll(List list, List list2) {
if (list == null || list2 == null) {
return list;
}
list.addAll(list2);
return list;
}
/**
* 添加元素(泛型)
*
* @author Pan
* @param 元素
* @param list 集合
* @param elements 一个或多个元素
* @return List
*/
@SafeVarargs
public static List addAll(List list, E... elements) {
if (list == null || elements == null) {
return list;
}
Collections.addAll(list, elements);
return list;
}
/**
* 添加元素(Map)
*
* @author Pan
* @param 键类型
* @param 值类型
* @param list 集合
* @param map Map
* @return List
*/
public static List addAll(List list, Map map) {
if (list == null || map == null) {
return list;
}
list.addAll(map.values());
return list;
}
/**
* 添加元素(Set)
*
* @author Pan
* @param 元素
* @param set 集合
* @param elements 一个或多个元素
* @return Set
*/
@SafeVarargs
public static Set addAll(Set set, E... elements) {
if (set == null || elements == null) {
return set;
}
Collections.addAll(set, elements);
return set;
}
/**
* Set添加元素(Map)
*
* @author Pan
* @param 键类型
* @param 值类型
* @param set 集合
* @param map Map
* @return Set
*/
public static Set addAll(Set set, Map map) {
if (set == null || map == null) {
return set;
}
set.addAll(map.values());
return set;
}
/**
* Set添加元素(collection)
*
* @author Pan
* @param 元素
* @param set 集合
* @param collection collection集合
* @return Set
*/
public static Set addAll(Set set, Collection collection) {
if (set == null || collection == null) {
return set;
}
set.addAll(collection);
return set;
}
/**
* 自动分组List
* 对未知分配数做一个均衡
*
* @author Pan
* @param 数据类型
* @param list 集合
* @return List
*/
public static List> averageList(List list) {
if (isEmpty(list)) {
return Empty.list();
}
int listSize = list.size();
int averageNum = averageNum(listSize);
// 总数 / 平均数 = 分组数
return partitionList(list, listSize / averageNum);
}
/**
* 计算平衡平均分配
* 返回最后一个值
*
* @author Pan
* @param listSize 集合长度
* @return int
*/
private static int averageNum(int listSize) {
int score = 0;
int index = 0;
int srcLen = 16;
int [] averageArr = new int[srcLen];
for (;;) {
if (index >= srcLen) {
srcLen = srcLen * 2;
averageArr = ArrayUtils.copy(averageArr, srcLen);
}
// 计算
averageArr[index] = listSize / ++score;
// 非第一次 && 值等于上一次时停止计算
if (index != 0 && averageArr[index] == averageArr[index - 1]) {
// 剔除0
int findZero = 0;
// j > 0 && 找不到0的值终止循环
for (int j = srcLen - 1; j > 0 && averageArr[j] == 0; j--) {
findZero ++;
}
if (findZero != 0) {
averageArr = ArrayUtils.copy(averageArr, srcLen - findZero);
}
// 终止查找
break;
}
++index;
}
// 返回最后一个平均数值
return averageArr[averageArr.length - 1];
}
/**
* 二分查找函数式
* 返回索引
* 如果未找到返回-1
*
* @author Pan
* @param 值类型
* @param 比较类型
* @param list 集合
* @param funcGet 数据流
* @param value 值
* @return int
*/
public static > int binarySearch(List list, FuncGet funcGet, C value) {
if (isEmpty(list)) {
return -1;
}
if (value == null) {
return -1;
}
int start = 0;
int end = list.size() - 1;
while (start <= end) {
// 计算出中间索引值
int middle = (end + start) >>> 1;//防止溢出
C data = funcGet.get(list.get(middle));
int comparison = value.compareTo(data);
if (comparison == 0) {
return middle;
// 判断下限
} else if (comparison < 0) {
end = middle - 1;
// 判断上限
} else {
start = middle + 1;
}
}
//若没有,则返回-1
return -1;
}
/**
* 对集合进行一个批量处理操作
* 自定义限制长度
*
* @author Pan
* @param 数据类型
* @param list 集合
* @param limit 限制长度
* @param pageFunc 分页函数
*/
public static void batchProcess(List list, int limit, FuncPage pageFunc) {
if (CollUtils.isEmpty(list)) {
return ;
}
int listSize = list.size();
int partitionLen = CollUtils.partitionLen(listSize, limit);
int fromIndex = 0;
int toIndex = limit;
for (int i = 0; i < partitionLen; i ++) {
if (listSize < limit || toIndex >= listSize) {
pageFunc.part(list.subList(fromIndex, listSize));
break;
}
pageFunc.part(list.subList(fromIndex, toIndex));
fromIndex = toIndex;
toIndex += limit;
}
}
/**
* 对集合进行一个批量处理操作(异步)
* 自定义限制长度
* 可以用于批量更新/插入等特定异步操作
*
* @author Pan
* @param 数据类型
* @param list 集合
* @param limit 限制长度
* @param batchFunc 分页函数
*/
public static void batchProcessAsync(List list, int limit, FuncPage batchFunc) {
if (CollUtils.isEmpty(list)) {
return ;
}
List> partitionList = CollUtils.partitionList(list, limit);
for (int i = 0; i < partitionList.size(); i++) {
List partition = partitionList.get(i);
CompletableFuture.runAsync(() -> batchFunc.part(partition));
}
}
/**
* 浅克隆
*
* @author Pan
* @param 数据类型
* @param list 集合
* @return List
*/
public static List copy(List list) {
return newArrayList(list);
}
/**
* 数值计算转换匹配类型
*
* @author Pan
* @param 数据类型
* @param list 集合
* @param calculationType 计算方式类型
* @return T
*/
@SuppressWarnings("unchecked")
private static T calculation(List list, CalculationTypeEnum calculationType) {
T type = list.get(0);
if (type instanceof String) {
return (T) calculationTypeStr((List) list, calculationType);
}
if (type instanceof Integer) {
return (T) calculationTypeInt((List) list, calculationType);
}
if (type instanceof Long) {
return (T) calculationTypeLong((List) list, calculationType);
}
if (type instanceof Float) {
return (T) calculationTypeFloat((List) list, calculationType);
}
if (type instanceof Double) {
return (T) calculationTypeDouble((List) list, calculationType);
}
return null;
}
/**
* String类型匹配计算方式
*
* @author Pan
* @param list 集合
* @param type 计算方式
* @return String
*/
private static String calculationTypeStr(List list, CalculationTypeEnum type) {
switch (type) {
case MAX:
return Collections.max(list);
case MIN:
return Collections.min(list);
case SUM:
int size = list.size();
if (size == 1) {
return Integer.toString(Integer.parseInt(list.get(0)));
}
String count = null;
for (int i = 0, len = size; i < len; i ++) {
String value = list.get(i);
if (!ValidParam.isEmpty(value)) {
count = Integer.toString(Integer.parseInt(count) + Integer.parseInt(value));
}
}
return count;
default:
return null;
}
}
/**
* Integer类型匹配计算方式
*
* @author Pan
* @param list 集合
* @param type 计算方式
* @return Integer
*/
private static Integer calculationTypeInt(List list, CalculationTypeEnum type) {
switch (type) {
case MAX:
return Collections.max(list);
case MIN:
return Collections.min(list);
case SUM:
int size = list.size();
if (size == 1) {
return list.get(0);
}
Integer count = 0;
for (int i = 0, len = size; i < len; i ++) {
Integer value = list.get(i);
if (ValidParam.isNotNull(value)) {
count = count + value;
}
}
return count;
default:
return null;
}
}
/**
* Long类型匹配计算方式
*
* @author Pan
* @param list 集合
* @param type 计算方式
* @return Long
*/
private static Long calculationTypeLong(List list, CalculationTypeEnum type) {
switch (type) {
case MAX:
return Collections.max(list);
case MIN:
return Collections.min(list);
case SUM:
int size = list.size();
if (size == 1) {
return list.get(0);
}
Long count = 0L;
for (int i = 0, len = size; i < len; i ++) {
Long value = list.get(i);
if (ValidParam.isNotNull(value)) {
count = count + value;
}
}
return count;
default:
return null;
}
}
/**
* Double类型匹配计算方式
*
* @author Pan
* @param list 集合
* @param type 计算方式
* @return Double
*/
private static Double calculationTypeDouble(List list, CalculationTypeEnum type) {
switch (type) {
case MAX:
return Collections.max(list);
case MIN:
return Collections.min(list);
case SUM:
int size = list.size();
if (size == 1) {
return list.get(0);
}
Double count = 0D;
for (int i = 0, len = size; i < len; i ++) {
Double value = list.get(i);
if (ValidParam.isNotNull(value)) {
count = count + value;
}
}
return count;
default:
return null;
}
}
/**
* Float类型匹配计算方式
*
* @author Pan
* @param list 集合
* @param type 计算方式
* @return Float
*/
private static Float calculationTypeFloat(List list, CalculationTypeEnum type) {
switch (type) {
case MAX:
return Collections.max(list);
case MIN:
return Collections.min(list);
case SUM:
int size = list.size();
if (size == 1) {
return list.get(0);
}
Float count = 0F;
for (int i = 0, len = size; i < len; i ++) {
Float value = list.get(i);
if (ValidParam.isNotNull(value)) {
count = count + value;
}
}
return count;
default:
return null;
}
}
/**
* 去重对象
* 如果数据存在Null则数据移除
*
* @author Pan
* @param 数据类型
* @param list 集合
* @return List
*/
public static List distinct(final List list) {
if (CollUtils.isEmpty(list)) {
return Empty.list();
}
return newArrayList(newLinkedHashSet(list));
}
/**
* 字段属性去重
* 数据量小或大都可使用
* 如果数据存在Null则原有数据移除
*
* @author Pan
* @param 数据类型
* @param list 集合
* @param fieldName 字段名
* @return List
*/
public static List distinct(List list, String fieldName) {
if (CollUtils.isEmpty(list)) {
return Empty.list();
}
List list2 = newArrayList();
MapUtils.newHashMap((Map map) -> {
Field field = ReflectionUtils.getField(ClassUtils.getClass(list), fieldName);
for (int i = 0, len = list.size(); i < len; i++) {
T srcObj = list.get(i);
if (ValidParam.isNotNull(srcObj)) {
Object srcValue = ReflectionUtils.getFieldValue(field, srcObj);
// 不为空与不存在时添加, 如果后续值出现重复则只保留第一次存放的值
if (ValidParam.isNotNull(srcValue) && map.get(srcValue) == null) {
map.put(srcValue, srcObj);
}
}
}
if (map.size() > 0) {
addAll(list2, map);
}
}, list.size());
return list2;
}
/**
* 根据自定义字段数据去重
* 如果数据存在Null则原有数据移除
* LinkedHashSet方式
*
* @author Pan
* @param 数据类型
* @param 返回类型
* @param list 集合
* @param funcGet 获取数据函数
* @return List
*/
public static List distinct(List list, FuncGet funcGet) {
return newArrayList(distinctToSet(list, funcGet));
}
/**
* 根据自定义字段数据去重
* LinkedHashSet
*
* @author Pan
* @param 数据类型
* @param 返回类型
* @param list 集合
* @param funcGet 获取数据函数
* @return Set
*/
public static Set distinctToSet(List list, FuncGet funcGet) {
if (CollUtils.isEmpty(list)) {
return Empty.set();
}
return newLinkedHashSet(newSet -> {
for (int i = 0; i < list.size(); i++) {
R r = funcGet.get(list.get(i));
if (!newSet.contains(r)) {
newSet.add(r);
}
}
}, list.size());
}
/**
* 差集-不修改原有对象(返回新对象)
* 假设有集合A和B,所有属于A且不属于B的元素的集合被称为A与B的差集。
* 示例:对于集合A = {a, b, c, d}和集合B = {b, c, w},则A与B的差集为{a, d}
*
* @author Pan
* @param 元素
* @param set Set集合
* @param set2 Set集合2
* @return Set
*/
public static Set difference(final Set set, final Set set2) {
if (isEmpty(set) && isEmpty(set2)) {
return Empty.set();
}
if (set2.containsAll(set)) {
return Empty.set();
}
return IteratorUtils.collectionResult(set, new FuncIteratorResultE>() {
Set hashSet = newHashSet();
@Override
public boolean next(E e, Iterator iterator) {
if (!set2.contains(e)) {
hashSet.add(e);
}
return true;
}
@Override
public Set call() {
return hashSet;
}
});
}
/**
* 差集-不修改原有对象(返回新对象)
* 假设有集合A和B,所有属于A且不属于B的元素的集合被称为A与B的差集。
* 示例:对于集合A = {a, b, c, d}和集合B = {b, c, w},则A与B的差集为{a, d}
*
* @author Pan
* @param 元素
* @param list 集合
* @param list2 集合2
* @return Set
*/
public static Set difference(final List list, final List list2) {
return difference(newHashSet(list), newHashSet(list2));
}
/**
* 比较两个集合是否一致
* 包含模式
* 验证是否全包含元素
*
* @author Pan
* @param 元素
* @param list 集合1
* @param list2 集合2
* @return boolean
*/
public static boolean eq(Collection list, Collection list2) {
return eq(list, list2, true);
}
/**
* 比较两个集合是否一致
* 全匹配模式
* 严格验证顺序,值
*
* @author Pan
* @param 元素
* @param list 集合1
* @param list2 集合2
* @return boolean
*/
public static boolean eqByOrder(Collection list, Collection list2) {
return eq(list, list2, false);
}
/**
* 比较两个集合是否一致
* 自定义模式
* true则验证判断包含元素
* false则严格验证顺序,值
*
* @author Pan
* @param list 集合1
* @param list2 集合2
* @param equalsMode 如果为true则验证判断包含,false则严格验证顺序,值
* @return boolean
*/
private static boolean eq(Collection list, Collection list2, boolean equalsMode) {
// 如果两个都为null视为true
if (list == null && list2 == null) {
return true;
}
if (list == null ||
list2 == null ||
list.size() != list2.size()) {
return false;
}
// 包含匹配模式
if (equalsMode) {
return list.containsAll(list2);
}
Iterator iterator = list.iterator();
Iterator iterator2 = list2.iterator();
while (iterator.hasNext()) {
if (!ObjectUtils.eq(iterator.next(), iterator2.next())) {
return false;
}
}
return true;
}
/**
* 过滤数据(在原集合基础上)
*
* @author Pan
* @param 元素
* @param list 原集合
* @param element 过滤元素
*/
public static void filter(List list, Object element) {
if (isEmpty(list)) {
return ;
}
IteratorUtils.collection(list, (e, iterator) -> {
if (ObjectUtils.eq(e, element)) {
iterator.remove();
}
});
}
/**
* 过滤数据(在原集合基础上)
*
* @author Pan
* @param 元素
* @param list 原集合
* @param collection 过滤集合
*/
public static void filter(List list, Collection collection) {
if (isEmpty(list)) {
return ;
}
list.removeAll(collection);
}
/**
* 过滤数据(在原集合基础上)
*
* @author Pan
* @param 元素
* @param list 集合
* @param filter 自定义过滤条件
*/
public static void filter(List list, FuncFilter filter) {
if (isEmpty(list)) {
return ;
}
filter((Collection) list, filter);
}
/**
* 过滤数据(在原集合基础上)
*
* @author Pan
* @param 元素
* @param collection 集合
* @param element 需要被过滤的数据
*/
public static void filter(Collection collection, Object element) {
if (isEmpty(collection)) {
return ;
}
IteratorUtils.collection(collection, (e, iterator) -> {
if (ObjectUtils.eq(e, element)) {
iterator.remove();
}
});
}
/**
* 过滤数据(在原集合基础上)
*
* @author Pan
* @param 元素
* @param collection 集合
* @param filter 自定义过滤条件
*/
public static void filter(Collection collection, FuncFilter filter) {
if (isEmpty(collection)) {
return ;
}
IteratorUtils.collection(collection, (e, iterator) -> {
if (filter.accept(e)) {
iterator.remove();
}
});
}
/**
* 搜索第一次匹配返回
*
* @author Pan
* @param 数据类型
* @param list 集合
* @param element 元素
* @return T
*/
public static T findOne(Collection list, Object element) {
if (isEmpty(list)) {
return null;
}
Iterator iterator = IteratorUtils.collection(list);
while (iterator.hasNext()) {
T next = iterator.next();
if (ObjectUtils.eq(next, element)) {
return next;
}
}
return null;
}
/**
* 搜索第一次匹配返回
*
* @author Pan
* @param 数据类型
* @param list 集合
* @param funcFind 搜索函数
* @return T
*/
public static T findOne(Collection list, FuncFind funcFind) {
if (isEmpty(list)) {
return null;
}
return IteratorUtils.collectionResult(list, new FuncIteratorResultE() {
T result = null;
@Override
public boolean next(T e, Iterator iterator) {
if (funcFind.accept(e)) {
result = e;
return false;
}
return true;
}
@Override
public T call() {
return result;
}
});
}
/**
* 根据查询值
* 找到某一条或多条匹配数据
*
* @author Pan
* @param list 集合
* @param searchValue 搜索值
* @return List
*/
public static List find(List list, Object searchValue) {
return findCall(list, t -> ObjectUtils.eq(t, searchValue) ? t : null);
}
/**
* 从中找到某一条匹配数据
* 根据条件找到一条或者多条的匹配数据
*
* @author Pan
* @param 数据类型
* @param 元素
* @param list 集合
* @param searchKey 对象值字段名
* @param searchValue 搜索值
* @return List 一个或多个匹配值
*/
public static List find(List list, String searchKey, E searchValue) {
if (isEmpty(list)) {
return Empty.list();
}
Field filed = ReflectionUtils.getField(ClassUtils.getClass(list), searchKey);
return findCall(list, t -> ObjectUtils.eq(ReflectionUtils.getFieldValue(filed, t), searchValue) ? t : null);
}
/**
* 根据自定义条件搜索数据
* 实现accept方法进行条件筛选
* 条件返回true则筛选成功
*
* @author Pan
* @param 元素
* @param list 集合
* @param findFunc 筛选方法
* @return List
*/
public static List find(Collection list, FuncFind findFunc) {
if (isEmpty(list)) {
return Empty.list();
}
List findList = newArrayList();
IteratorUtils.collection(list, (e, iterator) -> {
if (findFunc.accept(e)) {
findList.add(e);
}
});
return findList;
}
/**
* 根据自定义条件搜索数据
* 与find方法不同的是: find只能返回本身已有的值, findCall方法能返回自定义值(类型一致即可)
* 返回自定义值
* 例如list = {"1", "2", "2"} t.equals("2") return "11" 此时将返回两条 ["11", "11"]数据
* 条件返回true则筛选成功
*
* @author Pan
* @param 元素
* @param list 集合
* @param findCall 筛选方法
* @return List
*/
public static List findCall(Collection list, FuncFindCall findCall) {
return IteratorUtils.collectionResult(list, new FuncIteratorResultE>() {
private List findList = null;
@Override
public boolean next(E e, Iterator iterator) {
E accept = findCall.accept(e);
if (ValidParam.isNotNull(accept)) {
if (findList == null) {
findList = newArrayList();
}
findList.add(accept);
}
return true;
}
@Override
public List call() {
return findList;
}
});
}
/**
* 返回首次不为null的数据
*
* @author Pan
* @param 数据类型
* @param 返回类型
* @param list 集合
* @param funcGet 获取函数
* @return R
*/
public static R findFirstNotNull(List list, FuncGet funcGet) {
if (isEmpty(list)) {
return null;
}
for (int i = 0; i < list.size(); i++) {
R r = funcGet.get(list.get(i));
if (ValidParam.isNotNull(r)) {
return r;
}
}
return null;
}
/**
* 根据自定义条件进行分组
* key = 组名
* value = 值
* HashMap
*
* @author Pan
* @param 键类型
* @param 元素类型
* @param list 集合
* @param funcGroupBy 分组函数
* @return Map
*/
public static Map> groupBy(List list, FuncGroupBy funcGroupBy) {
if (isEmpty(list)) {
return Empty.map();
}
return MapUtils.newHashMap(newMap -> groupBy(newMap, list, funcGroupBy), list.size());
}
/**
* 根据自定义条件进行分组
* key = 组名
* value = 值
* LinkedHashMap
*
* @author Pan
* @param 键类型
* @param 元素类型
* @param list 集合
* @param funcGroupBy 分组函数
* @return Map
*/
public static Map> groupByToLinked(List list, FuncGroupBy funcGroupBy) {
if (isEmpty(list)) {
return Empty.map();
}
return MapUtils.newLinkedHashMap(newMap -> groupBy(newMap, list, funcGroupBy), list.size());
}
/**
* 根据自定义条件进行分组
* key = 组名
* value = 值
* CurrentHashMap
*
* @author Pan
* @param 键类型
* @param 元素类型
* @param list 集合
* @param funcGroupBy 分组函数
* @return Map
*/
public static Map> groupByToConcurrent(List list, FuncGroupBy funcGroupBy) {
if (isEmpty(list)) {
return Empty.map();
}
return MapUtils.newConcurrentHashMap(newMap -> groupBy(newMap, list, funcGroupBy), list.size());
}
/**
* 分组函数
*
* @author Pan
* @param 键类型
* @param 元素类型
* @param list 集合
* @param funcGroupBy 分组函数
*/
private static void groupBy(Map> map, List list, FuncGroupBy funcGroupBy) {
IteratorUtils.collection(list, (e, iterator) -> {
K key = funcGroupBy.groupBy(e);
if (key == null) {
return ;
}
List computeIfAbsent = map.computeIfAbsent(key, o -> newArrayList());
computeIfAbsent.add(e);
});
}
/**
* indexOf函数式
* 返回索引
* 如果未找到返回-1
*
* @param 值类型
* @param list 集合
* @param funcFind 寻找函数
* @return int
*/
public static int indexOf(List list, FuncFind funcFind) {
if (isEmpty(list)) {
return -1;
}
for (int i = 0, len = list.size(); i < len; i++) {
if (funcFind.accept(list.get(i))) {
return i;
}
}
return -1;
}
/**
* 判断是否当前为最后一个索引
*
* @author Pan
* @param 数据类型
* @param list 集合
* @param nowIndex 当前索引
* @return boolean true当前最后一个
*/
public static boolean isLastIndex(List list, int nowIndex) {
return list.size() -1 == nowIndex;
}
/**
* 交集-不修改原有对象(返回新对象)
* 所有属于集合A且属于集合B的元素所组成的集合
* E1 = {a, b, c ,d} E2 = {b, c} E1∩E2 = {b, c}
*
* @author Pan
* @param 元素
* @param e1 集合1
* @param e2 集合2
* @return Set
*/
public static Set intersection(List e1, List e2) {
return intersection(newHashSet(e1), newHashSet(e2));
}
/**
* 交集-不修改原有对象(返回新对象)
*
* 所有属于集合A且属于集合B的元素所组成的集合
* E1 = {a, b, c ,d} E2 = {b, c} E1∩E2 = {b, c}
*
* @author Pan
* @param 元素
* @param e1 集合1
* @param e2 集合2
* @return Set
*/
public static Set intersection(Set e1, Set e2) {
if ((isEmpty(e1) && isEmpty(e2))) {
return Empty.set();
}
return IteratorUtils.collectionResult(e1, new FuncIteratorResultE>() {
Set hashSet = newHashSet();
@Override
public boolean next(E e, Iterator iterator) {
if (e2.contains(e)) {
hashSet.add(e);
}
return true;
}
@Override
public Set call() {
return hashSet;
}
});
}
/**
* 判空
*
* @author Pan
* @param 元素
* @param collection 集合
* @return boolean true为空 false为 非空
*/
public static boolean isEmpty(Collection collection) {
return null == collection || collection.isEmpty();
}
/**
* 寻找最大值
* 支持String, Integer, Long, Double, Float类型
*
* @author Pan
* @param 元素
* @param list 集合
* @return E
*/
public static E max(List list) {
if (isEmpty(list)) {
return null;
}
return calculation(list, CalculationTypeEnum.MAX);
}
/**
* 寻找最大值
* 支持String, Integer, Long, Double, Float类型
*
* @author Pan
* @param 元素
* @param list 集合
* @param fieldName 字段名称
* @return Object
*/
public static Object max(List list, String fieldName) {
if (isEmpty(list)) {
return null;
}
return max(ReflectionUtils.getFieldValue(list, fieldName));
}
/**
* 寻找最大值
* 支持String, Integer, Long, Double, Float类型
*
* @param 数据类型
* @param 返回类型
* @param list 集合
* @param funcGet 函数
* @return R 找到的最大值
*/
public static R max(List list, FuncGet funcGet) {
R max = null;
for (int i = 0; i < list.size(); i++ ) {
R t = funcGet.get(list.get(i));
if (t == null) {
continue;
}
if (max == null) {
max = t;
}
if (t instanceof String && t.hashCode() > max.hashCode()) {
max = t;
}
if (t instanceof Number) {
Comparable tc = (Comparable) t;
if (tc.compareTo(max) > 0) {
max = t;
}
}
}
return max;
}
/**
* lastIndexOf函数式
* 返回索引
* 如果未找到返回-1
*
* @param 值类型
* @param list 集合
* @param funcFind 寻找函数
* @return int
*/
public static int lastIndexOf(List list, FuncFind funcFind) {
if (isEmpty(list)) {
return -1;
}
for (int i = list.size() - 1; i > 0; i--) {
if (funcFind.accept(list.get(i))) {
return i;
}
}
return -1;
}
/**
* 寻找最小值
* 支持String, Integer, Long, Double, Float类型
*
* @author Pan
* @param 元素
* @param list 集合
* @return E
*/
public static E min(List list) {
if (isEmpty(list)) {
return null;
}
return calculation(list, CalculationTypeEnum.MIN);
}
/**
* 寻找最小值
* 支持String, Integer, Long, Double, Float类型
*
* @param 数据类型
* @param 返回类型
* @param list 集合
* @param funcGet 函数
* @return R 找到的最大值
*/
public static R min(List list, FuncGet funcGet) {
R min = null;
for (int i = 0; i < list.size(); i++ ) {
R t = funcGet.get(list.get(i));
if (min == null) {
min = t;
if (min == null) {
continue;
}
}
if (t instanceof String && t.hashCode() < min.hashCode()) {
min = t;
}
if (t instanceof Number) {
Comparable tc = (Comparable) t;
if (tc.compareTo(min) < 0) {
min = t;
}
}
}
return min;
}
/**
* 寻找最小值
* 支持String, Integer, Long, Double, Float类型
*
* @author Pan
* @param 元素
* @param list 集合
* @param fieldName 字段名
* @return E
*/
public static Object min(List list, String fieldName) {
if (isEmpty(list)) {
return null;
}
return min(ReflectionUtils.getFieldValue(list, fieldName));
}
/**
* 构建ArrayList
*
* @author Pan
* @param 元素
* @return List
*/
public static