我有这个有趣的功能尝试使用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);
答案 0 :(得分:2)
查看您的管道:
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();
这将返回Optional<TheTypeReturnedBygetParameterValue>
。
随意删除任何不需要的null
支票(如果getParameterDetailId
或getParameterValue
永远不会返回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
管道根本不应该执行。