Java Stream通过orElse新增对象未加入列表问题如何解决?
问题分析
原有代码的逻辑仅在无匹配对象时返回新构造的实例,但不会主动将该实例写入源列表,因此需要额外新增列表插入的分支逻辑。
实现方案
方案1:Java 9+ 优雅写法(推荐)
用Optional自带的ifPresentOrElse方法分支处理匹配到/未匹配到的场景:
// 先获取源列表引用,避免重复调用get方法 var questaoList = inscTipoTrabAval.getInscricaoTipoTrabalhoAvaliadorQuestoes(); questaoList.stream() .filter(aq -> aq.getEventoQuestao().equals(eventoQuestao)) .findFirst() .ifPresentOrElse( // 匹配到现有对象,直接设置属性 aq -> aq.setJustificativa(justificativa), // 无匹配对象,构造新实例、设置属性后加入列表 () -> { var newQuestao = new InscricaoTipoTrabalhoAvaliadorQuestao(eventoQuestao, inscTipoTrabAval); newQuestao.setJustificativa(justificativa); questaoList.add(newQuestao); } );
方案2:Java 8 兼容写法
通过isPresent()手动做分支判断:
List<InscricaoTipoTrabalhoAvaliadorQuestao> questaoList = inscTipoTrabAval.getInscricaoTipoTrabalhoAvaliadorQuestoes(); Optional<InscricaoTipoTrabalhoAvaliadorQuestao> existQuestao = questaoList.stream() .filter(aq -> aq.getEventoQuestao().equals(eventoQuestao)) .findFirst(); if (existQuestao.isPresent()) { existQuestao.get().setJustificativa(justificativa); } else { InscricaoTipoTrabalhoAvaliadorQuestao newQuestao = new InscricaoTipoTrabalhoAvaliadorQuestao(eventoQuestao, inscTipoTrabAval); newQuestao.setJustificativa(justificativa); questaoList.add(newQuestao); }
注意事项
- 需确保
getInscricaoTipoTrabalhoAvaliadorQuestoes()返回的是可修改列表,如果返回的是不可变集合(比如Collections.unmodifiableList、Java 16+Stream.toList()生成的集合),需要先转为可修改集合再执行add操作:List<InscricaoTipoTrabalhoAvaliadorQuestao> modifiableList = new ArrayList<>(immutableList);
内容的提问来源于stack exchange,提问作者Romeu Fernandes Bessa
相关产品推荐
相关产品推荐

