【发布时间】:2022-01-05 14:01:23
【问题描述】:
我正在开发一个请求验证功能,我需要检查某个字符串值是否存在于包含在对象中的属性中,该对象作为映射条目的值包含,该映射是一部分一个对象,最后我的请求正文包含一组这些对象。
为了更清楚地说明,我将仅使用重要的部分代码重新创建我的情况。
假设我的ClassA 在请求正文中收到,它具有以下属性:
@Nullable
Set<ClassB> mySet = null;
现在,我们有 ClassB,它有一个特定的 ClassC 类型的包装对象:
@Nullable
ClassC classC;
包装类 ClassC 包含一个映射:
@Nullable
Map<String, ClassD> classDMap = new HashMap<>;
最后ClassD包含了需要检查的属性是否包含某个值:
@Nullable
String propertyForValidation;
目前我使用的代码如下所示:
public boolean isValid(ClassA body) {
return body.getMySet().stream()
.allMatch(x -> x.getClassC().getClassDMap().values().stream()
.allMatch(y -> y.getPropertyForValidation.equals("someValue"));
}
我的代码当前的问题是,当我上面描述的某些对象为空时,它无法按预期工作,因为我得到了很多 NullPointerExceptions。我想这可以通过大量 ifs 和 null 检查来解决,但我想知道是否有更优雅的方式来使用 Stream API?
感谢所有帮助,谢谢。
【问题讨论】:
-
你可以使用类似
Optional.of(x).map(ClassB::getClassC).map(ClassC::getClassDMap).map(Map::getValues).stream().flatMap(Collection::stream)...的东西。
标签: java java-stream