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

如何在flatmap中过滤流中的空对象

南宫书
2023-03-14

我已经为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());

需要在另一个地方使用VAL,如果VAL不为空,将在该地方进行后续调用。有没有更好的方法来防止NPE在这里,我尝试使用可选的内部平面图,但它抛出语法错误。

共有1个答案

乐正明辉
2023-03-14

您可以删除对getObjVal的重复调用,方法是在过滤器之前将其作为map执行。

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());
 类似资料:
  • 问题内容: 您如何先分组然后使用Java流应用过滤? 示例 :考虑此类:我想按部门分组,列出薪水大于2000的雇员。 这就是我可以做到的 输出量 由于B部门中没有雇员的薪水高于2000。因此B部门没有密钥: 但是实际上,我想使用空列表作为密钥– 预期产量 我们应该怎么做? 问题答案: nullpointer的答案显示了直接的方法。如果您不能更新到Java 9,没问题,那么这个收集器就没有魔力。这是

  • 我有这个对象,我需要过滤它。 我只需要在“数据”中输入“isEnabled”为真的值的ID

  • 我有一个员工类,有薪水和部门,还有一份员工名单。 我需要找到至少有30名员工支付至少100美元工资的部门数量。 到目前为止,我已经得到了每个部门的员工数量。但是我不知道如何应用过滤器。 任何帮助都将不胜感激。

  • 问题内容: 我的应用程序中有2个过滤器。根据某些条件,我想选择是否执行第二个过滤器。有没有办法做到这一点? 我做了一些谷歌搜索,但没有成功。我希望请求继续执行而不执行第二个过滤器。那可能吗? 任何帮助将不胜感激。 问题答案: 您可以在请求中设置一个属性,然后在第二个过滤器中对其进行检查。 您可以像这样简化上面的代码: 这样,您只需检查属性“ executeSecondFilter”的存在

  • 问题内容: 我试图在AngularJS中创建一个自定义过滤器,该过滤器将通过特定属性的值过滤对象列表。在这种情况下,我要按“极性”属性(“正”,“中性”,“负”的可能值)进行过滤。 这是我没有过滤器的工作代码: HTML: 这是JSON格式的“ $ scope.tweets”数组: 我可以提出的最佳过滤器如下: 此方法返回一个空数组。从“ console.log(polarity)”语句中不会打印

  • 我有一个映射: 我使用三个条件进行筛选: “日志类型”是“爬虫” “2020-05-23”上的“创建数据” “resp”的大小=0 我试图过滤与查询: {"查询":{"bool":{"必须":[{"术语":{"_logType":{"value":"爬虫"}}},{"范围":{"_createdAt":{"gte":"2020-05-23","lte":"2020-05-23","time_zon