filter-map上的JDK8 lambda NullPointerException

时间:2018-05-26 22:53:12

标签: java lambda nullpointerexception java-8

我有这个有趣的功能尝试使用JDK8。它在值的筛选过程之后从值列表返回,而不是兄弟列表参数值。

显然是我需要价值的集合。因为它是一对一的映射,它将成为数组的第一个元素。

结果是它与臭名昭着的NullPointerException打破了。 虽然我知道至少list1不是空的。如果我对house.getParkingInfo()进行检查,那么为什么不使用简单if - 条款的旧时尚风格写同样的东西呢?

是否有一个样式/指南/技巧来避免这个NullPointerException,并确保它将执行lambda 的每个部分,当且仅当它有有效数据?

return listOfPossibleHaircuts.stream().filter(p->p.getParameterDetailId().intValue()==object.getInfo().get("HAIR_STYLE").intValue() ).map(ParameterDetail::getParameterValue).collect(Collectors.toList()).get(0);

1 个答案:

答案 0 :(得分:2)

查看您的管道:

return listOfPossibleHaircuts.stream().filter(p->p.getParameterDetailId().intValue()==object.getInfo().get("HAIR_STYLE").intValue() ).map(ParameterDetail::getParameterValue).collect(Collectors.toList()).get(0);

为避免例外情况,您必须确保:

  1. p.getParameterDetailId()不为空
  2. getParameterValue不会返回null
  3. 此管道返回的列表不为空
  4. 我建议:

    return listOfPossibleHaircuts.stream()
                                 .filter(p->p.getParameterDetailId() != null)
                                 .filter(p->p.getParameterDetailId().equals(object.getInfo().get("HAIR_STYLE")))
                                 .map(ParameterDetail::getParameterValue)
                                 .filter(Objects::nonNull)
                                 .findFirst();
    

    这将返回Optional<TheTypeReturnedBygetParameterValue>

    随意删除任何不需要的null支票(如果getParameterDetailIdgetParameterValue永远不会返回null)。

    如果您确定findFirst()不会为空,您也可以链接到.get() List

    我的解决方案是假设object.getInfo().get("HAIR_STYLE") != null。这可以在运行Stream管道之前进行测试,并且正如Holger所评论的那样,可用于简化过滤:

    Object result = null;
    Object style = object.getInfo().get("HAIR_STYLE");
    if (style != null) {
        result = listOfPossibleHaircuts.stream()
                                       .filter(p->style.equals(p.getParameterDetailId()))
                                       .map(ParameterDetail::getParameterValue)
                                       .filter(Objects::nonNull)
                                       .findFirst()
                                       .orElse(null);
    }
    return result;
    

    我在这里做了另一个小假设 - 如果Stream,则object.getInfo().get("HAIR_STYLE") == null管道根本不应该执行。