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
相关产品推荐
相关产品推荐

