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

Java使用Lambda实现列表无匹配元素时新增,代码运行不生效求助

问题排查及修复方案

核心问题点

  • 新创建的对象未被写入列表:orElse()仅会返回新构造的QuestaoOpcaoIdioma对象,但你没有将该对象添加到对应QuestaoOpcao的多语言列表中,修改自然不会生效。
  • 匹配逻辑完全错位:每次循环中你都拉平了所有QuestaoOpcao的多语言列表做全局过滤,匹配到的是全局第一个符合语言要求的对象,不是当前循环到的第i个选项对应的多语言配置,完全不符合给每个选项补对应语言配置的需求。
  • 没有触发新增逻辑:你只构造了新对象,但没有任何写入集合的操作,相当于白创建了对象直接丢弃。

修正后的代码

for (int i = 0; i < questao.getQuestaoOpcao().size(); i++) {
    // 取当前循环对应的选项对象
    QuestaoOpcao opcaoAtual = questao.getQuestaoOpcao().get(i);
    // 仅检查当前选项的多语言列表
    Optional<QuestaoOpcaoIdioma> opcaoIdiomaOpt = opcaoAtual.getQuestaoOpcoesIdioma().stream()
            .filter(qoi -> qoi.getIdioma().equals(idiomaSelecionado))
            .findFirst();
    // 未找到匹配项时创建新对象并写入列表
    if (opcaoIdiomaOpt.isEmpty()) {
        QuestaoOpcaoIdioma novoIdioma = new QuestaoOpcaoIdioma(opcaoAtual, nomesOpcoesList.get(i), idiomaSelecionado);
        opcaoAtual.getQuestaoOpcoesIdioma().add(novoIdioma);
    }
}

可选简化写法(Java 9+)

可以用ifPresentOrElse省略显式的空判断:

for (int i = 0; i < questao.getQuestaoOpcao().size(); i++) {
    QuestaoOpcao opcaoAtual = questao.getQuestaoOpcao().get(i);
    opcaoAtual.getQuestaoOpcoesIdioma().stream()
            .filter(qoi -> qoi.getIdioma().equals(idiomaSelecionado))
            .findFirst()
            .ifPresentOrElse(
                // 存在匹配项时的逻辑,无额外操作可留空
                qoi -> {},
                () -> opcaoAtual.getQuestaoOpcoesIdioma().add(new QuestaoOpcaoIdioma(opcaoAtual, nomesOpcoesList.get(i), idiomaSelecionado))
            );
}

内容的提问来源于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.28 09:36:06