我创建了一个方法,该方法基于给定的实体(我使用JPA)为java中的表返回原始html。现在,我希望能够使用比较器接口对表进行排序。因此,我创建了比较器接口的匿名内部类,以对实体的属性进行排序。这工作正常,但是我的问题是我现在无法对NullsFirst或Nullslast进行排序。我尝试过的所有方法均无效。有谁知道如何解决这个问题?
这是代码:
if (!sortProperty.equals("") && sortProperty != null) {
Collections.sort(list, new Comparator<T>() {
public int compare(T e1, T e2) {
Method sortGetter = null;
try {
for (PropertyDescriptor pd : Introspector.getBeanInfo(entity).getPropertyDescriptors()) {
if (pd.getName().equals(sortProperty) && pd.getReadMethod() != null) {
sortGetter = pd.getReadMethod();
}
}
} catch (IntrospectionException e) {
e.printStackTrace();
}
try {
if (sortGetter.getReturnType().equals(String.class)) {
return sortGetter.invoke(e1).toString().compareTo(sortGetter.invoke(e2).toString());
} else if (sortGetter.getReturnType().equals(Integer.TYPE)) {
return (Integer) sortGetter.invoke(e1) - (Integer) sortGetter.invoke(e2);
} else if (sortGetter.getReturnType().equals(Date.class)) {
return ((Date) sortGetter.invoke(e1)).compareTo((Date) sortGetter.invoke(e2));
} else if (sortGetter.getReturnType().equals(Timestamp.class)) {
return ((Timestamp) sortGetter.invoke(e1)).compareTo((Timestamp) sortGetter.invoke(e2));
}
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
}
return 0;
}
});
}
最佳答案
将sortGetter.invoke(e1)
和sortGetter.invoke(e2)
拉出到变量中(为清楚起见,省略了try / catch):
Object o1 = sortGetter.invoke(e1);
Object o2 = sortGetter.invoke(e2);
检查是否为空,如果为空,则返回:
if (o1 == null || o2 == null) {
// This results in nulls last. Use != for nulls first.
return Boolean.compare(o1 == null, o2 == null);
}
现在,您可以继续使用
if (sortGetter.getReturnType().equals(String.class))
类型的逻辑(显然,您无需再次调用sortGetter.invoke(e1)
和sortGetter.invoke(e2)
)。