Java中的异常,用于过滤时lambda表达式中的空值

sTg*_*sTg 21 java lambda java-8

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

personList.stream().filter(
    t -> t.getStatus().equalsIgnoreCase(
        "In Progress")).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

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

Swe*_*per 42

你可以反转方法的2个"操作数" equals:

"In Progress".equalsIgnoreCase(t.getStatus())
Run Code Online (Sandbox Code Playgroud)

这样既然"In Progress"永远不会为空,就不会有NPE!

  • @EelLee回击Yoda (8认同)
  • 尤达反击.经典! (3认同)
  • 这个,_this_和**这**.我已经失去了数量我修复Java库的NPE(公共和非公共)的次数仅仅使用Yoda条件.我希望有一种方法可以更多地传播这一点. (3认同)
  • 这隐藏了可能存在状态无效的"人"这一事实.[@TheRock3t](/sf/users/89184301/)给出了更好的答案. (3认同)

The*_*k3t 24

尝试过滤掉具有空状态的对象

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

  • 这比Sweeper的答案更好,因为它明确了你想要对null值发生什么. (6认同)

Nam*_*man 12

您可以链接/合并filter条件以对具有短路条件的非空值进行操作,如下所示:

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

  • 从nullpointer自己说出来!并记住孩子,订购事宜! (6认同)