流:避免NullPointerException

时间:2016-09-21 13:14:42

标签: java java-8

我必须得到数组的第一个元素。但是元素可能是空的;如果元素为空,我放一个空字段(我试图生成一个pdf)

现在是我的代码:

public void makePdf(Long id) throws IOException {
    Candidacy ca = candidacyRepository.findOne(id); 
    cos.beginText();

    cos.showText(
       ca.getInterviews().stream().map(Interview::getAgency).map(Agency::getAgencyName).collect( Collectors.toList()).get(0)!=null?ca.getInterviews().stream().map(Interview::getAgency).map(Agency::getAgencyName).collect( Collectors.toList()).get(0):"")); 

    cos.endText();
}

所以我希望不要阻止生成pdf。 非常感谢您的支持!

更新

抱歉缺乏精确度: 我也对日期排序。

public void makePdf(Long id) throws IOException {
        Candidacy ca = candidacyRepository.findOne(id); 
        cos.beginText();

        cos.showText(
           ca.getInterviews().stream().sorted((a,b)-> a.getInterviewDate().compareTo(b.getInterviewDate())).sorted((a,f)->f.getInterviewDate().compareTo(a.getInterviewDate())).sorted((b,f)->b.getInterviewDate().compareTo(f.getInterviewDate())).map(Interview::getAgency).map(Agency::getAgencyName).collect( Collectors.toList()).get(0)!=null?ca.getInterviews().stream().sorted((a,b)-> a.getInterviewDate().compareTo(b.getInterviewDate())).sorted((a,f)->f.getInterviewDate().compareTo(a.getInterviewDate())).sorted((b,f)->b.getInterviewDate().compareTo(f.getInterviewDate())).map(Interview::getAgency).map(Agency::getAgencyName).collect( Collectors.toList()).get(0):"")); 

        cos.endText();
    }

我得到一个NullPointerException:/ 谢谢你的帮助

1 个答案:

答案 0 :(得分:4)

此代码没有意义。您正在执行相同的Stream管道两次,并且每当您只需要List的第一个元素时生成整个List

您可以使用findFirst获取Stream的第一个元素。

编辑:

在测试我的原始答案后,结果证明它不起作用。如果第一个元素是findFirst(),则NullPointerException会抛出null

您可以在调用findFirst()之前设置默认值来避免这种情况:

ca.getInterviews().stream()
                  .map(Interview::getAgency)
                  .map(Agency::getAgencyName)
                  .map(s->s!=null?s:"") // this will replace null with ""
                  .firstFirst()
                  .get();