【问题标题】:Exception in Java for null values in lambda expression while filtering [duplicate]过滤时 lambda 表达式中的空值在 Java 中出现异常 [重复]
【发布时间】:2017-10-26 09:51:15
【问题描述】:

我有一个对象Person,它有两个属性NameStatus。我希望从对象列表中过滤出状态为In ProgressPerson 对象。这是我的代码:

personList.stream().filter(
    t -> t.getStatus().equalsIgnoreCase(
        "In Progress")).collect(Collectors.toList());

但是代码抛出了nullpointerexception 错误。当我检查时,我看到一些具有In Progress 状态的对象具有空值。我们如何在 lambda 中处理这个问题?

【问题讨论】:

  • 您可以像处理任何其他代码一样处理它。在这种情况下,最好执行 "In Progress".equalsIgnoreCase(t.getStatus())
  • 真正的问题是当状态为空时你想要发生什么。你想过滤掉那些行吗?包括他们?以有意义的信息失败?从方法返回false? Null 是一种特殊情况,需要深思熟虑,而不是忽略一些技术技巧。如果你不想有这种想法,你应该首先避免让 status 为 null。

标签: java lambda java-8


【解决方案1】:

您可以反转equals 方法的两个“操作数”:

"In Progress".equalsIgnoreCase(t.getStatus())

这样由于"In Progress" 永远不能为空,就不会有NPE!

【讨论】:

  • 尤达反击。经典!
  • 这个、这个这个。仅使用 Yoda 条件修复 Java 库的 NPE(公共的和非公共的)的次数我已经记不清了。我希望有一种方法可以进一步宣传这一点。
  • @EelLee 回击尤达
  • 或者总是使用 Objects.equals() 而不是 instance.equals()
  • 这隐藏了可能存在无效状态的person 的事实。 @TheRock3t 给出了更好的答案。
【解决方案2】:

尝试过滤掉状态为空的对象

personList
  .stream()
  .filter(t -> t.getStatus() != null)
  .filter(t -> t.getStatus().equalsIgnoreCase("In Progress"))
  .collect(Collectors.toList());

【讨论】:

  • 这比 Sweeper 的回答要好,因为它明确了您希望对空值发生什么。
【解决方案3】:

您可以链接/合并filtering 条件以对具有短路条件的非空值进行操作:

personList.stream()
          .filter(t -> t.getStatus() != null && t.getStatus().equalsIgnoreCase("In Progress"))
          .collect(Collectors.toList());

【讨论】:

  • 从空指针自己说的!记住孩子们,订单很重要!
【解决方案4】:

假设status = null,您不会选择它。然后您可以使用"In Progress".equalsIgnoreCase(t.getStatus()) 来避免您的状态中出现任何可能的null 值。

总的来说,

personList.stream()
    .filter(t -> "In Progress".equalsIgnoreCase(t.getStatus()))
    .collect(Collectors.toList());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-06
    • 2020-06-28
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    相关资源
    最近更新 更多