import java.lang.reflect.Field;
import java.util.*;
/**
* @author black_fire
*/
public class ObjectUtil {
/**
* 判斷一個對象是否為空 使用時調用此方法即可
*
* @param obj 要判斷的對象
* @param strings 表當判斷自定義對象時可以傳入,其他類型傳入 Null 即可
* @return 不為空 ture 空 false
*/
public static Boolean isEmpty(Object obj, List<String> strings) {
Boolean empty = false;
if (obj != null) {
empty = switchBoolean(getType(obj), obj, strings);
}
return empty;
}
/**
* 獲取當前對象的類型
*
* @param object 要獲取類型的對象
* @return 當前對象的類型
*/
public static String getType(Object object) {
String type = object.getClass().getName();
int length = type.lastIndexOf(".");
if (object instanceof Map) {
return "Map";
}
if (object instanceof List) {
return "List";
}
return type.substring(length + 1);
}
/**
* 當前對象為 String 類型時, 判斷當前對象是否為 null 且 它是否為 "";
*
* @param obj String 類型的對象
* @return 不為空 true 為空 false
*/
public static Boolean strIsEmpty(Object obj) {
return !"".equals(obj) && obj != null;
}
/**
* 當已知當前對象為 map 類型,判斷當前 map 的長度不為0 且它本身不為空 時返回 true
*
* @param obj 已知當前對象是 map 類型
* @return 為空 返回 false 不為空 返回 true
*/
public static Boolean mapIsEmpty(Object obj) {
Map<?, ?> map = (Map<?, ?>) obj;
return map != null && map.size() != 0;
}
/**
* 當已知當前對象為 list 類型,判斷當前 list 的長度不為 0 且它本身不為空時返回 true
*
* @param obj 已知當前對象是 map 類型
* @return 為空 返回 false 不為空 返回 true
*/
public static Boolean listIsEmpty(Object obj) {
List<?> list = (List<?>) obj;
return list != null && list.size() != 0;
}
/**
* 判斷 integer 類型的數據是不是空.
*
* @param obj 要判斷的 Integer
* @return 不為空就返回 true
*/
public static Boolean integerIsEmpty(Object obj) {
return obj != null;
}
/**
* 當對象為自定義時,根據屬性來判斷當前對象是否為空
*
* @param obj 自定義對象
* @param strings 當判斷自定義對象時可以傳入,其他類型傳入 Null 即可
* @return 只要有一個屬性不為空 就返回 true 當所有屬性都為空時返回 false
*/
public static Boolean customizeIsEmpty(Object obj, List<String> strings) {
// 從該對象中獲取所有屬性
Field[] fields = obj.getClass().getDeclaredFields();
Map<String, Boolean> map = new HashMap<>(5);
for (Field field : fields) {
field.setAccessible(true);
try {
Object fieldObj = field.get(obj);
map.put(field.getName(), isEmpty(fieldObj, strings));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return iteratorStrings(map, strings);
}
/**
* 迭代獲取到的 Map 分兩種情況進行判斷,如果傳入的字符串默認需要某些屬性才為true需要傳入 List<String> 如果傳入 Null 那么默認當前對象有一個屬性就為 true
*
* @param map 迭代屬性獲取的map
* @param strings 當判斷自定義對象時可以傳入,其他類型傳入 Null 即可
* @return 返回當前對象是否為空.
*/
public static Boolean iteratorStrings(Map<String, Boolean> map, List<String> strings) {
List<Boolean> list = new ArrayList<>();
if (listIsEmpty(strings)) {
for (String str : strings) {
list.add(map.get(str));
}
return !list.contains(false);
} else {
for (String key : map.keySet()) {
list.add(map.get(key));
}
return list.contains(true);
}
}
/**
* 將 switch 判斷提取稱方法 方便多重使用
*
* @param type 當前判斷對象的類型,以 String 類型傳入
* @param obj 要判斷的對象
* @param strings 當判斷自定義對象時可以傳入,其他類型傳入 Null 即可.
* @return 當對象不為空時 true 為空時 false
*/
public static Boolean switchBoolean(String type, Object obj, List<String> strings) {
switch (type) {
case "String":
return strIsEmpty(obj);
case "Integer":
return integerIsEmpty(obj);
case "Map":
return mapIsEmpty(obj);
case "List":
return listIsEmpty(obj);
default:
return customizeIsEmpty(obj, strings);
}
}
}