如何从平面图中的流中过滤空对象
How to filter null object from streaming in flatmap
我已经为 NPE 保护了第一个流,但是第二个流也可以抛出 NPE,下面是代码片段:
Set<TestObj> vals = Optional.ofNullable(testObjs)
.orElse(Collections.emptySet())
.stream()
.filter(Objects::nonNull)
.flatMap(testObj -> getObjVal(testObj.getId()).getObj().stream())
.collect(Collectors.toSet());
如果 getObjVal(String id) 返回 null,第二个流将抛出 NPE。
下面的代码是为了防止第二个 NPE,但我觉得这样做不是一个好方法:
Set<TestObj> vals = Optional.ofNullable(testObjs)
.orElse(Collections.emptySet())
.stream()
.filter(Objects::nonNull)
.filter(testObj -> getObjVal(testObj.getId()) != null)
.flatMap(testObj->getObjVal(testObj.getId()).getObj().stream())
.collect(Collectors.toSet());
需要在另一个地方使用vals,如果vals不为空,将进行后续调用。
这里有没有更好的方法来防止 NPE,我尝试在平面地图中使用 Optional,但是会抛出语法错误。
您可以通过在 filter
.
之前作为 map
来删除对 getObjVal
的重复调用
Set<TestObj> vals = Optional.ofNullable(testObjs)
.orElse(Collections.emptySet())
.stream()
.filter(Objects::nonNull)
.map(testObj -> getObjVal(testObj.getId()))
.filter(Objects::nonNull)
.map(TestObject::getObj)
.flatMap(Collection::stream)
.collect(Collectors.toSet());
我已经为 NPE 保护了第一个流,但是第二个流也可以抛出 NPE,下面是代码片段:
Set<TestObj> vals = Optional.ofNullable(testObjs)
.orElse(Collections.emptySet())
.stream()
.filter(Objects::nonNull)
.flatMap(testObj -> getObjVal(testObj.getId()).getObj().stream())
.collect(Collectors.toSet());
如果 getObjVal(String id) 返回 null,第二个流将抛出 NPE。
下面的代码是为了防止第二个 NPE,但我觉得这样做不是一个好方法:
Set<TestObj> vals = Optional.ofNullable(testObjs)
.orElse(Collections.emptySet())
.stream()
.filter(Objects::nonNull)
.filter(testObj -> getObjVal(testObj.getId()) != null)
.flatMap(testObj->getObjVal(testObj.getId()).getObj().stream())
.collect(Collectors.toSet());
需要在另一个地方使用vals,如果vals不为空,将进行后续调用。 这里有没有更好的方法来防止 NPE,我尝试在平面地图中使用 Optional,但是会抛出语法错误。
您可以通过在 filter
.
map
来删除对 getObjVal
的重复调用
Set<TestObj> vals = Optional.ofNullable(testObjs)
.orElse(Collections.emptySet())
.stream()
.filter(Objects::nonNull)
.map(testObj -> getObjVal(testObj.getId()))
.filter(Objects::nonNull)
.map(TestObject::getObj)
.flatMap(Collection::stream)
.collect(Collectors.toSet());