【问题标题】:How to avoid null values ​in a stream如何避免流中的空值
【发布时间】:2019-10-20 12:16:00
【问题描述】:

我们的情况是,列表中有损坏的数据 X,并且该损坏的数据 X 的存在阻止了对与 X 相同类型的 Y 数据的操作。这是不正常的,我们必须屏蔽代码,使损坏数据X的存在不会阻塞其他有效数据的使用。

我将 Optional 与操作过滤器一起使用,如果名称为 null 我们跳过过滤器。

     Personne personne = null;
     String name= personne.getName();
     try {
        Optional<Personne> abstractPersonne= 
      APIPersonne.getAllPersonne(currentPersonne.getMethod())
                                                            .stream()
                                                            .filter(e -> e.getName() != null && e.getName().equals(name))
                                                            .findAny();
  if (abstractPersonne.isPresent())
    personne= abstractPersonne.get();
}

有没有办法避免 (e-> e.getName != null) 的测试?

【问题讨论】:

  • 确保它不是null,你可以避免它。如果它可以是null,那么除非你遇到 NPE,否则你必须检查它。

标签: java java-stream optional


【解决方案1】:

如果您确定变量“name”是空安全的,只需反转条件即可。例如,而不是

e.getName().equals(name)

使用

name.equals(e.getName())

【讨论】:

  • 这个问题,我不知道这个名字是否为空安全
  • @Rodik 注意逻辑:如果namenull,那么abstractPersonnel 将是Optional.empty,这意味着personnel 将具有null 的值。因此,在String name= personne.getName(); 这一行之后,您可以进行空值检查:if (name == null) return; 现在,您确定namenot null。因此,您可以按照@Harshal Khachane 的建议安全地扭转这种情况
【解决方案2】:

反转条件:name.equals(e.getName())

.filter(e -> name.equals(e.getName()))

【讨论】:

  • 这个答案如何有没有办法避免 (e-> e.getName != null) 的测试?
【解决方案3】:

您可以像这样使用 Optional.ofNullable(T) 进行检查

  • 检查值不为空
  • 检查你的字符串(列表值和你想要的字符串是否相等)
Optional<Personne> abstractPersonne = APIPersonne
                    .getAllPersonne(currentPersonne.getMethod())
                    .stream()
                    .filter(e -> Optional.ofNullable(e).isPresent()  && e.getName().equals(name))
                    .findAny();
            if (abstractPersonne.isPresent())
                personne= abstractPersonne.get();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多