Java Stream 在 List 中收集对象,显示大小为 1 但对象为 null

问题描述 投票:0回答:2

我正在开发一个 SpringBoot 项目,在测试时我故意在请求中传递类似的内容并得到一个 NullPointerException:

{
    "materials": [
        {

        }
    ]
}

我不想在请求类中的

materials
上使用@NotNull,因为
materials
字段可以为空。 但当它不为空时,我想确保存在一些字段,因为我需要验证其值。

final List<Material> materials = materialRequests.getMaterials().stream().map(MaterialRequest::getMaterial).collect(Collectors.toList());

// Throws NullPointerException here
final Set<String> materialIds = materials.stream().map(Material::getUuid).collect(Collectors.toSet()); 

调试时我看到了这个:

materials
显示它有 1 个元素,但它是 null,因此,我得到了一个空指针期望。 我怎样才能在这里检查它是否为空..为什么会有这样的行为?

java java-stream
2个回答
3
投票

在应用

null
之前从流中过滤掉
map()
元素:

final Set<String> materialIds = materials.stream()
    .filter(Objects::nonNull)
    .map(Material::getUuid)
    .collect(Collectors.toSet());

2
投票

使用

.filter()
过滤掉空值:

final Set<String> materialIds = materials.stream().filter(s -> s != null).map(Material::getUuid).collect(Collectors.toSet()); 
© www.soinside.com 2019 - 2024. All rights reserved.