使用java 8流处理null属性并使用lambda表达式进行排序

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)


joe*_*tde 9

看起来你正在寻找类似的东西:

list.sort(Comparator.comparing(Entity::getParent, 
                               Comparator.nullsLast(Integer::compareTo)));
Run Code Online (Sandbox Code Playgroud)

父null的所有元素都将放在末尾,其余元素将按其父级排序.

  • 这个解决方案对我有用.因为我不想过滤空值. (2认同)

Dom*_*aja 6

尝试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.

  • 这应该工作.你也可以做`.filter(Objects :: nonNull)` (5认同)