【问题标题】:Convert Map to List Objects using Lambda使用 Lambda 将 Map 转换为 List 对象
【发布时间】:2022-01-07 16:09:24
【问题描述】:

我正在对Map<AvaliadorEventoDTO, Map<TipoQuestionario, List<EventoQuestaoDTO>>> 中的对象列表进行分组,然后我正在遍历地图以创建一个包含已分组信息的新对象。

List<EventoQuestaoDTO> list = new ArrayList<EventoQuestaoDTO>(
        eventoQuestaoService.buscarEventoQuestaoDTO(empresa, evento, idioma,
                inscTipoTrabAval.getAvaliadorEvento().getId(), inscTipoTrabAval.getInscricaoTipoTrabalho().getId(), inscTipoTrabAval.getId()));

avaliacoes = new ArrayList<EventoAvaliacaoDTO>();

Map<AvaliadorEventoDTO, Map<TipoQuestionario, List<EventoQuestaoDTO>>> map = list.stream()
        .collect(Collectors.groupingBy(EventoQuestaoDTO::getAvaliadorEvento, Collectors.groupingBy(EventoQuestaoDTO::getTipoQuestionario)));

for (Map.Entry<AvaliadorEventoDTO, Map<TipoQuestionario, List<EventoQuestaoDTO>>> avaliador : map.entrySet()) {
    List<QuestionarioDTO> questionarios = new ArrayList<QuestionarioDTO>();
    for(Map.Entry<TipoQuestionario, List<EventoQuestaoDTO>> questionario : avaliador.getValue().entrySet()) {
        questionarios.add(new QuestionarioDTO(questionario.getKey(), questionario.getValue()));
    }
    avaliacoes.add(new EventoAvaliacaoDTO(avaliador.getKey(), questionarios));
}

但我想优化 for in lambdas 表达式,将 Map 转换为 DTO QuestionarioDTO 列表,而不需要使用 for 并因此使用更少的行。

谁能给个灯?

【问题讨论】:

    标签: java lambda java-stream


    【解决方案1】:

    这是一个简单的例子:

    Map<String, String> map = new HashMap<String, String>();
    map.put("key 1", "value 1");
    map.put("key 2", "value 2");
    map.put("key 3", "value 3");
        
    List<Object> list = new ArrayList<Object>();
    map.forEach((key, value) -> list.add(key + " : " + value));
        
    

    【讨论】:

      【解决方案2】:

      以下应该有效:

      List<EventoAvaliacaoDTO> avaliacoes = map.entrySet().stream().map(entry -> {
          List<QuestionarioDTO> questionarios = entry.getValue().entrySet().stream().map(innerEntry -> 
              new QuestionarioDTO(innerEntry.getKey(), innerEntry.getValue())
          ).collect(Collectors.toList());
          return new EventoAvaliacaoDTO(avaliador.getKey(), questionarios);
      }).collect(Collectors.toList());
      

      它是否比嵌套的 for 循环更具可读性?我真的很怀疑。请记住,并非所有事情都应该使用 Java 流来完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-23
        相关资源
        最近更新 更多