首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >仅当不为空时使用Java8中的lambda筛选值

仅当不为空时使用Java8中的lambda筛选值
EN

Stack Overflow用户
提问于 2015-10-01 17:36:22
回答 6查看 298.9K关注 0票数 213

我有一个对象列表,上面写着car。我想使用Java8根据一些参数来过滤这个列表,但是如果参数是null,它就会抛出NullPointerException。如何过滤掉null值?

当前代码如下

代码语言:javascript
复制
requiredCars = cars.stream().filter(c -> c.getName().startsWith("M"));

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

EN

回答 6

Stack Overflow用户

发布于 2016-05-24 05:39:33

在这个特殊的例子中,我认为@Tagir是100%正确的,把它放到一个过滤器中,然后做两个检查。我不会使用Optional.ofNullable,可选的东西实际上是返回类型,而不是逻辑。但实际上不是这里也不是那里。

我想指出的是,在广泛的情况下,java.util.Objects有一个很好的方法来解决这个问题,所以您可以这样做:

代码语言:javascript
复制
cars.stream()
    .filter(Objects::nonNull)

这将清除您的空对象。对于任何不熟悉的人来说,这是以下内容的速记:

代码语言:javascript
复制
cars.stream()
    .filter(car -> Objects.nonNull(car))

要部分回答手头的问题,请返回以"M"开头的汽车名称列表

代码语言:javascript
复制
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,你也可以这样做:

代码语言:javascript
复制
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),你将只返回名单的名字,而不是汽车。所以不那么漂亮,但完全回答了这个问题:

代码语言:javascript
复制
cars.stream()
    .filter(car -> Objects.nonNull(car))
    .filter(car -> Objects.nonNull(car.getName()))
    .filter(car -> car.getName().startsWith("M"))
    .collect(Collectors.toList());
票数 430
EN

Stack Overflow用户

发布于 2015-10-01 17:37:49

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

代码语言:javascript
复制
requiredCars = cars.stream()
                   .filter(c -> c.getName() != null)
                   .filter(c -> c.getName().startsWith("M"));
票数 81
EN

Stack Overflow用户

发布于 2016-08-29 22:36:13

提出的答案很好。我只想提出一个改进方案,以处理使用Optional.ofNullablenew feature in Java 8

代码语言:javascript
复制
 List<String> carsFiltered = Optional.ofNullable(cars)
                .orElseGet(Collections::emptyList)
                .stream()
                .filter(Objects::nonNull)
                .collect(Collectors.toList());

因此,完整的答案将是:

代码语言:javascript
复制
 List<String> carsFiltered = Optional.ofNullable(cars)
                .orElseGet(Collections::emptyList)
                .stream()
                .filter(Objects::nonNull) //filtering car object that are null
                .map(Car::getName) //now it's a stream of Strings
                .filter(Objects::nonNull) //filtering null in Strings
                .filter(name -> name.startsWith("M"))
                .collect(Collectors.toList()); //back to List of Strings
票数 66
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32884195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档