5
回答
Java8的Optional判断非空
Optional<ReportDetail> detailOptional = reportDetailList.stream().filter(rd -> rd.getCommentId().longValue()==c.getId()).findFirst();

代码到了这里,这个 detailOptional 实际是最终要 get() 到一个 ReportDetail 对象,然后调用。但是如果 filter 没有筛选到内容的话,detailOptional.orElse() 之后得到的对象还是要做 if 判断。感觉这个有点多余

<无标签>
举报
游_戏_人_间
发帖于2个月前 5回/331阅

引用来自“zh0”的评论

reportDetailList
.stream()
.filter(rd -> rd.getCommentId().longValue()==c.getId())
.findFirst()
.map(rd -> rd.getScore())
.ifPresent(c::setScore);

这个答案应该是标准答案了

如果你在这里要拿到里面的东西(作为最终结果),那进行get / getOrElse 这些肯定是少不了的,就跟不用option 判断非空(!=null)一样,总是少不了的.       但是如果你后继还要进行处理,可以再接着 map/filter ...., 不用每次都进行非空判断

引用来自“zawhyx”的评论

如果你在这里要拿到里面的东西(作为最终结果),那进行get / getOrElse 这些肯定是少不了的,就跟不用option 判断非空(!=null)一样,总是少不了的.       但是如果你后继还要进行处理,可以再接着 map/filter ...., 不用每次都进行非空判断

if (detailOptional.isPresent()) {
    c.setScore(detailOptional.get().getScore());
}

比如,后面的代码是要做这样的操作,怎么改成 functional style 呢?

引用来自“zawhyx”的评论

如果你在这里要拿到里面的东西(作为最终结果),那进行get / getOrElse 这些肯定是少不了的,就跟不用option 判断非空(!=null)一样,总是少不了的.       但是如果你后继还要进行处理,可以再接着 map/filter ...., 不用每次都进行非空判断

引用来自“游_戏_人_间”的评论

if (detailOptional.isPresent()) {
    c.setScore(detailOptional.get().getScore());
}

比如,后面的代码是要做这样的操作,怎么改成 functional style 呢?

可以使用这种方式

//这里的map,一定是在detailOptional不为空的时候才会执行里面的逻辑
//这里必须要返回一个东西才行,可以根据具体的场景返回不同的内容;示例就直接返回了 c 
detailOptional.map(detail -> {
    c.setScore(detail.getScore());
    return c;
})

 

reportDetailList
.stream()
.filter(rd -> rd.getCommentId().longValue()==c.getId())
.findFirst()
.map(rd -> rd.getScore())
.ifPresent(c::setScore);
顶部