使用Lambda将地图转换为列表对象



我正在对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));
}

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

有人能点灯吗?

以下内容应该有效:

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流来完成。

这里有一个简单的例子:

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));

最新更新