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