如何从平面图中的流中过滤空对象

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());