【问题标题】:will objectList.stream().collect(Collectors.toMap(Object::getField, Function.identity)) return null?objectList.stream().collect(Collectors.toMap(Object::getField, Function.identity)) 会返回 null 吗?
【发布时间】:2022-01-02 17:46:38
【问题描述】:

我有一个列表形式的数据库,然后我使用上面的函数将其转换为 hashMap(已经检查了这个列表不为空或为空)。但是 sonarLint 一直告诉我上面的函数可能返回 null,它可能会捕获 NPE。当我使用增强的for循环时,警告会消失。

我不知道为什么最终,希望你能帮助我离开这里。 非常感谢。

sonarLint 所说的下面的代码可能会返回 null:

return objectList.stream().filter(Objects::nonNull).collect(Collectors.toMap(Object::getField, Function.identity()));

sonarLint 下面的代码说没问题:

   Map<String, Object> map = new HashMap<>();
   for(Object obj : ObjectList) {
       map.put(obj.getField(), obj);
   }
   return map;

【问题讨论】:

  • 我知道您正在检查列表是否不为空,但您没有检查列表中的每个对象是否不为空。在您收集之前添加一个过滤器(Objects::nonNull),以确保每个 Object 不为空
  • 感谢您的回复,它帮助我学习了过滤器的使用。我已经按照您的方式确保列表中的每个对象都不为空,但 sonarLint 仍然不断告诉我我用来获取哈希图的方式可能为空。也许我没有说得很清楚:sonarLint 并不是说​​我使用的方法可能会捕获 NPE,它告诉我我使用的方法可能会返回 null。

标签: java java-stream collectors


【解决方案1】:

您的代码可以很好地处理非空,可能值得访问声纳规则,并参考Check condition inside lambda expression using Stream API has SonarQube issues

【讨论】:

  • sonarLint 指出 map.get(someKey) 可能会抛出 NPE(我在其他地方使用此地图),而不是我上面使用的方法可能会抛出 NPE。所以当我确认收集器不会返回 null 时,我可以说 sonarLint 的提示是无稽之谈。谢谢你的回答。
  • @zihaoQ 那么,你应该在问题中这么说。收集器返回 null(换句话说,映射为 null)和映射的 get 方法返回 null 之间存在根本区别。
【解决方案2】:

不,不会。整个集合框架的构建方式确保您不会以 null 结束,而可以提供一些空集合。

所以:collector 不会返回 null。

但是:根据您的上下文,obj.getField() 可能会返回 null。在某些情况下,收集方法会为 null keys 抛出 NPE。

【讨论】:

  • " 整个集合框架的构建方式确保您不会以 null 结尾,而可以提供一些空集合。" 明白了。感谢您耐心的回答。如果收集器不会返回 null,我更喜欢 sonarLint 的警告是没有意义的。再次感谢~
猜你喜欢
  • 2018-04-28
  • 2021-07-23
  • 2018-09-13
  • 1970-01-01
  • 2019-10-28
  • 2017-04-11
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多