仅当 Java8 中的 lambda 不为空时才过滤值

新手上路,请多包涵

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

当前代码如下

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

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

原文由 vaibhavvc1092 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 622
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());

一旦你习惯了速记 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());

不幸的是,一旦你 .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());

原文由 xbakesx 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题