web-dev-qa-db-ja.com

Comparator.nullsLastはNullPointerExceptionを回避しません

オブジェクトのリストをnull許容フィールドの1つで並べ替えたい。

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
    }

}

この種類のリストを並べ替えるにはどうすればよいですか?

14
rellocs wood

Comparator.nullsLastを2回使用する必要があります。

list.sort(nullsLast(comparing(Bean::getVal, nullsLast(naturalOrder()))));
  • 最初にnullsLastBeanオブジェクトがnullの場合を処理します。
  • 2番目のnullsLastは、Bean::getValの戻り値がnullの場合を処理します。

リストにnull値がないことが確かな場合は、最初のnullsLastを省略できます(@Holgerで注記されています)。

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

あなたはおそらく使用することができます:

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