不能用比较器排序null

时间:2016-08-07 13:46:06

标签: java spring guava comparator

当我尝试对某个用户在其个人资料中具有空值的用户进行排序时,我不断获得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()为空。
我该如何解决这个问题?我希望能够使用空值对用户进行排序。

2 个答案:

答案 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());

这里有两种可能的空值:

  1. c2.getProfile()为空
  2. c2.getProfile().getFirstName()为空
  3. 您需要明确保护这些Comparator的{​​{1}}实施。