Man*_*Joy 11 java nullpointerexception java-8
让我们考虑一个Parent只包含一个Integer属性的类.我创建了6个父类对象,属性值为100, 20, 300, 400, 500, null.
现在我将所有对象添加到列表中(列表名称是列表).然后我想得到属性值大于的对象100.我为此目的使用了Java 8流.
Predicate<Entity> predicate = e -> e.getParentId() < 100;
result = list.stream().filter(predicate).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我还想按降序对列表进行排序.我为此目的使用了以下代码.
Comparator<Entity> comp = (d1,d2) -> d2.getId().compareTo(d1.getId());
list.sort(comp);
Run Code Online (Sandbox Code Playgroud)
在这两种情况下我都得到了NullPointerException.
怎么办呢?
Bri*_*etz 15
这里的所有答案都围绕着"抛出坏元素,那些有空的元素getParentId()".如果它们确实很糟糕,那可能就是答案.但是还有另一种选择:( Comparators.nullsFirst或者最后一个.)这允许您将处理空值的事物比较为小于(或大于)所有非空值,因此您不必抛弃具有null parentId的元素.
Comparator<Entity> cmp = nullsLast(comparing(Entity::getParentId));
List<Entity> list = list.stream().sorted(cmp).collect(toList());
Run Code Online (Sandbox Code Playgroud)
你可以做类似的过滤; 将您的谓词定义为:
Predicate<Entity> predicate = e -> e.getParentId() != null
&& e.getParentId() < 100;
Run Code Online (Sandbox Code Playgroud)
看起来你正在寻找类似的东西:
list.sort(Comparator.comparing(Entity::getParent,
Comparator.nullsLast(Integer::compareTo)));
Run Code Online (Sandbox Code Playgroud)
父null的所有元素都将放在末尾,其余元素将按其父级排序.
尝试parentId仅对非空值进行预过滤:
result = list.stream().filter(e -> e.getParentId() != null).filter(predicate).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
[编辑]只是看到,属性(e.parentId)似乎是那个null.在那种情况下,第二件事,排序,打破.您正在排序原始列表,而不是已过滤的列表.试试result.sort(comp),然后你应该避免NPE.