【问题标题】:Comparator.nullsLast does not avoid NullPointerExceptionComparator.nullsLast 不避免 NullPointerException
【发布时间】:2019-04-18 05:53:12
【问题描述】:

我想按可空字段之一对对象列表进行排序。

为了避免NullPointerexception,我使用Comparator.nullsLast。但是异常还是出现了:

public class Test {

    public static void main(String[] args) {
        List<Bean> l = new ArrayList<>();
        for (int i=0;i<5;i++) {
            Bean b = new Bean("name_"+i,i);
            l.add(b);
        }
        l.get(2).setVal(null);
        System.out.println(l);
        Collections.sort(l, Comparator.nullsLast(Comparator.comparing(Bean::getVal)));
        System.out.println(l);
    }

    static class Bean{
        String name;
        Integer val;
        // omit getters & setters & constructor
    }

}

我怎样才能对这种列表进行排序?

【问题讨论】:

  • @rellocswood 请发布您的解决方案作为答案,而不是编辑问题。

标签: java collections java-8 java-stream comparator


【解决方案1】:

你应该使用两次Comparator.nullsLast

list.sort(nullsLast(comparing(Bean::getVal, nullsLast(naturalOrder()))));
  • 首先nullsLast 将处理Bean 对象为空的情况。
  • 第二个nullsLast会处理Bean::getVal的返回值为null的情况。

如果您确定列表中没有任何 null 值,则可以省略第一个 nullsLast(如 @Holger 所述):

list.sort(comparing(Bean::getVal, nullsLast(naturalOrder())));

【讨论】:

  • 如果 bean 永远不是 null,则省略外部 nullsLast,即只有属性值可能是 null
【解决方案2】:

你可以使用:

Collections.sort(l, Comparator.comparing(Bean::getVal,
                              Comparator.nullsLast(Comparator.naturalOrder())));

【讨论】:

    【解决方案3】:

    您可以查看此示例

    @Override
    public int compare(Example o1, Example o2) {
      if (o1 == null && o2 == null) return 0;
      if (o1 == null) return -1;
      if (o2 == null) return 1;
     return Comparator.comparing(Example::getSta,
          Comparator.nullsLast(Comparator.naturalOrder()))
          .thenComparing(Example::getId,
              Comparator.nullsLast(Comparator.naturalOrder()))
          .compare(o1, o2);
    }
    
    class Example {
    String sta; Long id;}
    

    【讨论】:

      猜你喜欢
      • 2016-12-01
      • 1970-01-01
      • 2012-07-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多