仅在 Java8 中使用 lambda 不为空时才筛选值

我有一个对象列表说.我想使用Java 8根据某些参数过滤此列表。但是如果参数是 ,则抛出 。如何过滤掉空值?carnullNullPointerException

当前代码如下

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

如果返回 ,则抛出 。NullPointerExceptiongetName()null


答案 1

在这个特定的例子中,我认为@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());

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

    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());

不幸的是,一旦你只返回名字列表,而不是汽车。所以不那么漂亮,但完全回答了这个问题:.map(Car::getName)

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

答案 2

您只需要过滤具有名称的汽车:null

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