当前位置: 首页 > 知识库问答 >
问题:

在Java8中使用lambda仅在非空时过滤值

秦才英
2023-03-14

我有一个对象列表,比如car。我想根据使用Java 8的一些参数过滤这个列表。但如果参数为null,则抛出nullPointerException。如何过滤掉空值?

当前代码如下

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

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

共有2个答案

韩阳成
2023-03-14

您只需筛选名称为null的汽车:

requiredCars = cars.stream()
                   .filter(c -> c.getName() != null)
                   .filter(c -> c.getName().startsWith("M"));
暴乐邦
2023-03-14

在这个特定的例子中,我认为@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());
 类似资料:
  • 如何在Java 8 lambda中使用非final变量。它抛出编译错误,称“封闭范围中定义的局部变量日期必须是final或实际上是final” 我实际上想实现以下目标: 如何实现此目的?它会为 date2 引发 comilation 错误。谢谢

  • 有可能在流中过滤更多次吗?例如,如果我有一个带有ID的列表,我想流一个HashMap,并将HashMap的键映射到列表中的键,以及它们在哪里匹配,我想从HashMap中获取对象,并再次过滤它,例如该对象中的int字段大于3,并在最后求和。例如,如果它发现10种情况,其中列表的键和HashMap的键相等,它过滤这10种情况,并发现3种情况,例如int字段大于3,它最终返回这些的总和。 到目前为止,这

  • 我使用了Gson,但我需要转换器只序列化非空值或非空值。 例如: 现在,将该对象转换为json的Gson实例如下所示

  • 如何过滤<代码>地图 仅当列表中的任何员工具有字段值性别=“M”时,我才必须过滤。 输入:

  • 我是Java8的新手,正在学习lambda表达式。 我有接口。 检查配置是否为空,返回空字符串。 检查集合是否为空,返回空字符串。 如果collection不为null,并且key存在,则返回值else return“”; 在Java8中如何做到这一点? 试过这个: 也发布了Java7代码,我试图用lambda表达式解决Java7的if-else部分。

  • 我有一个HashMap,我需要使用一些函数对其进行筛选: 上述代码中的错误是变量的声明类型。应该是而不是。 所以现在的功能代码是: