当我尝试对某个用户在其个人资料中具有空值的用户进行排序时,我不断获得nullpointerexception
。我的印象是Google Collection
会处理这些空值,但它似乎无法正常工作。
这是我使用的代码:
Comparator<UserModel> firstName_comparator = new Comparator<UserModel>() {
@Override
public int compare(UserModel c1, UserModel c2) {
return c1.getProfile().getFirstName().toLowerCase()
.compareTo(c2.getProfile().getFirstName().toLowerCase());
}
};
Collections.sort(users, Ordering.from(firstName_comparator).nullsLast());
此特定行会抛出nullpointerexception
:
.compareTo(c2.getProfile().getFirstName().toLowerCase());
因为getProfile()
为空。
我该如何解决这个问题?我希望能够使用空值对用户进行排序。
答案 0 :(得分:2)
不,Guava不会忽略你的NullPointerException。您提供了一个比较器,这个比较器应该尊重比较器合同。抛出NullPointerException不是合同的一部分。
String firstName1 = c1.getProfile() == null? null : c1.getProfile().getFirstName().toLowerCase();
String firstName2 = c2.getProfile() == null? null : c1.getProfile().getFirstName().toLowerCase();
return Ordering.natural().nullsFirst().compare(firstName1, firstName2);
// or nullsLast(), depending on what you prefer
或者,更简单:
Comparator<UserModel> comparator =
Ordering.natural()
.nullsFirst()
.onResultOf(model -> c1.getProfile() == null? null : c1.getProfile().getFirstName().toLowerCase());
答案 1 :(得分:1)
我认为Google Collection会处理这些null 值
nullLast方法仅检查集合中的特定元素是否为null
,并将其放在集合的末尾。
此特定行抛出nullpointerexception:
.compareTo(c2.getProfile().getFirstName().toLowerCase());
这里有两种可能的空值:
c2.getProfile()
为空c2.getProfile().getFirstName()
为空您需要明确保护这些Comparator
的{{1}}实施。