Java 流:避免NullPointerException

Java 流:避免NullPointerException,java,java-8,Java,Java 8,我必须得到数组的第一个元素,但该元素可能是空的;如果元素是空的,我会放一个空字段,我会尝试生成一个pdf 这是我现在的代码: public void makePdf(Long id) throws IOException { Candidacy ca = candidacyRepository.findOne(id); cos.beginText(); cos.showText( ca.getInterviews().stream().map(Inter

我必须得到数组的第一个元素,但该元素可能是空的;如果元素是空的,我会放一个空字段,我会尝试生成一个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:/
感谢您的帮助

此代码没有意义。您将执行相同的流管道两次,每次生成一个完整的列表时,您只需要该列表的第一个元素

可以使用findFirst获取流的第一个元素

编辑:

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

通过在调用findFirst之前设置默认值,可以避免这种情况:


这个代码没有意义。您将执行相同的流管道两次,每次生成一个完整的列表时,您只需要该列表的第一个元素

可以使用findFirst获取流的第一个元素

编辑:

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

通过在调用findFirst之前设置默认值,可以避免这种情况:


您的错误是什么?Add.filteri->i!=流式传输集合后立即为空。只是一个旁注,当重复一个110个字符长的表达式时,您自己不会有不好的感觉吗?难道你没有想到将结果放入局部变量吗?你的错误是什么?Add.filteri->i!=流式传输集合后立即为空。只是一个旁注,当重复一个110个字符长的表达式时,您自己不会有不好的感觉吗?难道你不想把结果放入局部变量吗?我会使用.filters->s!=null或.filterObjects::nonNull然后您将获得第一个非null值。@PeterLawrey我不认为这是目的-根据OP的代码,目的是获取第一个元素并将其转换为null,而不是过滤掉null值。但我可能错了。我认为使用是一种变通方法,但您可能是对的。很抱歉,精度不高:我必须对三个元素进行排序,这就是为什么我没有使用findFirst。@AdamD,但您仅在对流进行排序并收集到列表后才获取列表的第一个元素。findFirst仍将工作,但流的所有元素都将被处理,以便对它们进行排序。我将使用.filters->s!=null或.filterObjects::nonNull然后您将获得第一个非null值。@PeterLawrey我不认为这是目的-根据OP的代码,目的是获取第一个元素并将其转换为null,而不是过滤掉null值。但我可能错了。我认为使用是一种变通方法,但您可能是对的。很抱歉,精度不高:我必须对三个元素进行排序,这就是为什么我没有使用findFirst。@AdamD,但您仅在对流进行排序并收集到列表后才获取列表的第一个元素。findFirst仍将工作,但流的所有元素都将被处理,以便对它们进行排序。
ca.getInterviews().stream()
                  .map(Interview::getAgency)
                  .map(Agency::getAgencyName)
                  .map(s->s!=null?s:"") // this will replace null with ""
                  .firstFirst()
                  .get();