Comparator.nullsLast 没有避免 NullPointerException
Comparator.nullsLast does not avoid NullPointerException
我想按可为空的字段之一对对象列表进行排序。
为了避免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
}
}
如何对这种列表进行排序?
您可以使用:
Collections.sort(l, Comparator.comparing(Bean::getVal,
Comparator.nullsLast(Comparator.naturalOrder())));
你应该使用 Comparator.nullsLast
两次:
list.sort(nullsLast(comparing(Bean::getVal, nullsLast(naturalOrder()))));
- 首先
nullsLast
将处理 Bean
对象为空的情况。
- 第二个
nullsLast
将处理 Bean::getVal
的 return 值为 null 的情况。
如果您确定列表中没有任何 null
值,那么您可以省略第一个 nullsLast
(如@Holger 所述):
list.sort(comparing(Bean::getVal, nullsLast(naturalOrder())));
您可以查看此示例
@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;}
我想按可为空的字段之一对对象列表进行排序。
为了避免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
}
}
如何对这种列表进行排序?
您可以使用:
Collections.sort(l, Comparator.comparing(Bean::getVal,
Comparator.nullsLast(Comparator.naturalOrder())));
你应该使用 Comparator.nullsLast
两次:
list.sort(nullsLast(comparing(Bean::getVal, nullsLast(naturalOrder()))));
- 首先
nullsLast
将处理Bean
对象为空的情况。 - 第二个
nullsLast
将处理Bean::getVal
的 return 值为 null 的情况。
如果您确定列表中没有任何 null
值,那么您可以省略第一个 nullsLast
(如@Holger 所述):
list.sort(comparing(Bean::getVal, nullsLast(naturalOrder())));
您可以查看此示例
@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;}