只有在Java8中使用lambda时不过滤值才能过滤值

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

我有一个对象列表说car。我想基于使用Java 8的一些参数来过滤这个列表。但是如果参数是null,它会抛出NullPointerException。如何过滤出空值?

目前的代码如下

requiredCars = cars.stream().filter(c -> c.getName().startsWith("M"));

NullPointerException如果getName()返回则抛出null

提问于
用户回答回答于

只需要过滤null名称为的cars:

requiredCars = cars.stream()
                   .filter(c -> c.getName() != null)
                   .filter(c -> c.getName().startsWith("M"));
用户回答回答于

在这个特定的例子中,我认为@Tagir是100%正确的将它放入一个过滤器并执行两次检查。我不会使用Optional.ofNullable可选的东西是真正的返回类型不要做逻辑...但真的既不在这里也不在那里。

我想指出,java.util.Objects在广泛的情况下有一个很好的方法,所以你可以这样做:

cars.stream()
    .filter(Objects::nonNull)

这将清除你的空对象。对于任何不熟悉的人来说,这就是以下几点:

cars.stream()
    .filter(car -> Objects.nonNull(car))

要完全回答手头的问题,以返回具有名称的汽车列表,并且该列表始于"M"

cars.stream()
    .filter(car -> Objects.nonNull(car))
    .map(car -> car.getName())
    .filter(carName -> Objects.nonNull(carName))
    .filter(carName -> carName.startsWith("M"))
    .collect(Collectors.toList());

一旦你习惯了速记lambda,你也可以这样做:

cars.stream()
    .filter(Objects::nonNull)
    .map(Car::getName)        // Assume the class name for car is Car
    .filter(Objects::nonNull)
    .filter(carName -> carName.startsWith("M"))
    .collect(Collectors.toList());

扫码关注云+社区