非常实用的java比较器,贴上代码:
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mchange.v1.lang.NullUtils;
@SuppressWarnings("deprecation")
public class JVisaCommonCompare {
private static Logger LOGGER = LoggerFactory.getLogger(JVisaCommonCompare.class);
/** 获取不同值的字段(可以不同类型) */
public static <S extends Object, T extends Object> Set<String> getDifferentFieldName(S source, T target, List<String> excludeFieldName) {
LOGGER.info("======================getDifferentFieldName,source:[{}],target:[{}]",
ToStringBuilder.reflectionToString(source), ToStringBuilder.reflectionToString(target));
Set<String> fieldName = new HashSet<>();
if (BooleanUtils.isTrue(NullUtils.equalsOrBothNull(source, target))) {
return fieldName;
}
JsonConfig config = new JsonConfig();
if (!CollectionUtils.isEmpty(excludeFieldName)) {
String[] excludeArray = excludeFieldName.toArray(new String[excludeFieldName.size()]);
config.setExcludes(excludeArray);
}
JSONObject sourceObj = JSONObject.fromObject(source, config);
JSONObject targetObj = JSONObject.fromObject(target, config);
fieldName = getAllDifferentFieldName(sourceObj, targetObj, config);
LOGGER.info("======================getDifferentFieldName,result:[{}]", fieldName);
return fieldName;
}
/** 判断两个对象是否每个字段都相等 */
public static <S extends Object, T extends Object> Boolean isAllTheSameOfObject(S source, T target, List<String> excludeFieldName) {
LOGGER.info("======================isAllTheSameOfObject,source:[{}],target:[{}]",
ToStringBuilder.reflectionToString(source), ToStringBuilder.reflectionToString(target));
Set<String> fieldName = new HashSet<>();
if (BooleanUtils.isTrue(NullUtils.equalsOrBothNull(source, target))) {
return true;
}
JsonConfig config = new JsonConfig();
if (!CollectionUtils.isEmpty(excludeFieldName)) {
String[] excludeArray = excludeFieldName.toArray(new String[excludeFieldName.size()]);
config.setExcludes(excludeArray);
}
JSONObject sourceObj = JSONObject.fromObject(source, config);
JSONObject targetObj = JSONObject.fromObject(target, config);
fieldName = getAllDifferentFieldName(sourceObj, targetObj, config);
if (CollectionUtils.isEmpty(fieldName)) {
return true;
}
return false;
}
/** 获取不同值的字段名字(任何不同类型比较) */
@SuppressWarnings({ "unused", "unchecked" })
private static Set<String> getAllDifferentFieldName(JSONObject source, JSONObject target, JsonConfig config) {
Set<String> fieldName = new HashSet<>();
if (BooleanUtils.isTrue(NullUtils.equalsOrBothNull(source, target))) {
return fieldName;
}
// if exist JSONObject is null
if (BooleanUtils.isTrue(source.isNullObject())) {
fieldName = new HashSet<>(JSONArray.toCollection(config == null ? target.names() : target.names(config)));
return fieldName;
}
if (BooleanUtils.isTrue(target.isNullObject())) {
fieldName = new HashSet<>(JSONArray.toCollection(config == null ? source.names() : source.names(config)));
return fieldName;
}
// set the config of field
JSONArray fieldKeySource = null;
JSONArray fieldKeyTarget = null;
if (null != config) {
fieldKeySource = source.names(config);
fieldKeyTarget = target.names(config);
} else {
fieldKeySource = source.names();
fieldKeyTarget = source.names();
}
// compare
for (int sindex = 0; null != fieldKeySource && sindex < fieldKeySource.size(); sindex++) {
Object key = fieldKeySource.get(sindex);
if (!BooleanUtils.isTrue(target.containsKey(key))) {
fieldName.add((String) key);
continue;
}
Object value1 = source.get(key);
Object value2 = target.get(key);
if (!ObjectUtils.equals(value1, value2)) {
fieldName.add((String) key);
}
}
for (int tindex = 0; null != fieldKeyTarget && tindex < fieldKeyTarget.size(); tindex++) {
Object key = fieldKeyTarget.get(tindex);
if (!BooleanUtils.isTrue(source.containsKey(key))) {
fieldName.add((String) key);
continue;
}
Object value2 = target.get(key);
Object value1 = source.get(key);
if (!ObjectUtils.equals(value2, value1)) {
fieldName.add((String) key);
}
}
return fieldName;
}
}