import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class ListFilterUtil {
/**
*
* @param list 原始数据数组
* @param filterPropList 模糊查询属性名列表
* @param keywordList 模糊查询属性对应值列表
* @param accurateFilterPropList 精确查询属性名列表
* @param accurateFilterValueList 精准查询属性对应值列表
* @throws Exception
*/
public static <E> void filter(List<E> list, List<String> filterPropList, List<String> keywordList, List<String> accurateFilterPropList, List<String> accurateFilterValueList) throws Exception {
int filterLength = filterPropList.size();
int keyLength = keywordList.size();
int accurateFilterLength = accurateFilterPropList.size();
int accurateFilterValueLength = accurateFilterValueList.size();
if (filterLength != keyLength || accurateFilterLength != accurateFilterValueLength) {
throw new RuntimeException("属性数组元素个数和关键字数组元素个数不相等");
}
List<E> resList = new ArrayList<>();
for (E e : list) {
boolean flag = true;
ACCURATE: for(int i = 0; i < accurateFilterLength; i++){
String filterProp = accurateFilterPropList.get(i);
String keyword = accurateFilterValueList.get(i);
String[] keywords = keyword.toLowerCase().split("/");
Object value = ListFilterUtil.forceGetFieldValue(e, filterProp);
if(value == null){
flag = false;
break ACCURATE;
}else{
String valueStr = value.toString().toLowerCase();
for (String propValue : keywords) {
if(Objects.equals(valueStr, propValue)){
continue ACCURATE;
}
}
flag = false;
break ACCURATE;
}
}
if(flag){
for(int i = 0; i < filterLength; i++){
String filterProp = filterPropList.get(i);
String keyword = keywordList.get(i);
Object value = ListFilterUtil.forceGetFieldValue(e, filterProp);
if(value == null || !value.toString().toLowerCase().contains(keyword.toLowerCase())){
flag = false;
break;
}
}
}
if(flag){
resList.add(e);
}
}
list.clear();
list.addAll(resList);
}
/**
* 获取指定对象的指定属性值(去除private,protected的限制)
*
* @param obj
* 属性名称所在的对象
* @param fieldName
* 属性名称
* @return
* @throws Exception
*/
public static Object forceGetFieldValue(Object obj, String fieldName) throws Exception {
Field field = obj.getClass().getDeclaredField(fieldName);
Object object = null;
boolean accessible = field.isAccessible();
if (!accessible) {
// 如果是private,protected修饰的属性,需要修改为可以访问的
field.setAccessible(true);
object = field.get(obj);
// 还原private,protected属性的访问性质
field.setAccessible(accessible);
return object;
}
object = field.get(obj);
return object;
}
}
java多属性集合过滤工具类
最新推荐文章于 2023-03-30 22:44:54 发布