Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 过滤器映射上的JDK8 lambda NullPointerException_Java_Lambda_Nullpointerexception_Java 8 - Fatal编程技术网

Java 过滤器映射上的JDK8 lambda NullPointerException

Java 过滤器映射上的JDK8 lambda NullPointerException,java,lambda,nullpointerexception,java-8,Java,Lambda,Nullpointerexception,Java 8,我有一个有趣的函数,尝试使用JDK8。在对同级列表执行值的筛选过程之后,它从值列表返回参数值 显然,作为我需要价值的集合。因为它是一对一的映射,这将是数组的第一个元素 结果是它与臭名昭著的NullPointerException一起中断。 虽然我知道至少list1不是空的。如果我选中了house.getparkininfo(),那么为什么不使用简单的If-子句的旧样式来编写相同的内容呢 是否有一种风格/指南/技巧来避免这种NullPointerException,并确保当且仅当它具有有效数据时,

我有一个有趣的函数,尝试使用JDK8。在对同级列表执行值的筛选过程之后,它从值列表返回参数值

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

结果是它与臭名昭著的
NullPointerException
一起中断。 虽然我知道至少
list1
不是空的。如果我选中了
house.getparkininfo()
,那么为什么不使用简单的
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);

查看您的管道:

return listOfPossibleHaircuts.stream().filter(p->p.getParameterDetailId().intValue()==object.getInfo().get("HAIR_STYLE").intValue() ).map(ParameterDetail::getParameterValue).collect(Collectors.toList()).get(0);
为避免例外情况,您必须确保:

  • p.getParameterDetailId()
    不为空
  • getParameterValue
    不返回null
  • 此管道返回的列表不为空
  • 我建议:

    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();
    
    这将返回一个
    可选的

    请随意删除任何不需要的
    null
    检查(如果
    getParameterDetailId
    getParameterValue
    无法返回
    null

    如果您确定
    列表不会为空,还可以链接到
    findFirst()
    a
    .get()

    我的解决方案是假设
    object.getInfo().get(“头发样式”)!=空
    。这可以在运行
    管道之前进行测试,正如霍尔格所评论的,可以用来简化过滤:

    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;
    

    我在这里做了另一个小小的假设-如果
    object.getInfo().get(“HAIR_STYLE”)==null,则根本不应该执行
    管道。感谢双重或三重过滤和Objects::nonNull是游戏的一部分,我不知道。谢谢Eran的解释。@hephestos注意前两个过滤器可以组合使用:
    filter(p->p.getParameterDetailId()!=null和&p.getParameterDetailId().equals(object.getInfo().get(“HAIR_STYLE”)
    只有在
    object.getInfo().get(“HAIR_STYLE”)
    不为
    null时,此项才有效。但是如果您假设,一个
    .filter(p->object.getInfo().get(“HAIR_STYLE”).equals(p.getParameterDetailId())
    就足够了。尽管我更愿意将该操作移出流以避免对每个元素求值:
    Object val=Object.getInfo().get(“HAIR_STYLE”)。过滤器(val==null?p->p.getParameterDetailId()==null:p->val.equals(p.getParameterDetailId())
    @Holger好点。我假设
    object.getInfo().get(“HAIR_STYLE”)
    不为空,因为在运行
    流之前可以检查一次。我没有考虑这个假设所允许的过滤的简化。