You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:45:02