5 votes

Java 8 flux - élément de la carte à la paire d'éléments

J'ai un flux d'éléments. Je veux mapper chaque élément à deux éléments différents du même type afin que mon flux soit deux fois plus long par conséquent. J'ai fait cela en concaténant deux flux, mais je me demande s'il est possible de le faire de manière plus simple? Ce que j'ai fait jusqu'à présent:

private List getTranslationFilesNames() {
return Stream.concat(SUPPORTED_LANGUAGES.stream()
                .map(lang -> PATH_TO_FILES_WITH_TRANSLATIONS_1 + lang + FILE_EXTENSION),
        SUPPORTED_LANGUAGES.stream()
                .map(lang -> PATH_TO_FILES_WITH_TRANSLATIONS_2 + lang + FILE_EXTENSION))
        .collect(Collectors.toList());
}

Je ne trouve pas cette solution très élégante. Existe-t-il une meilleure approche pour obtenir le même effet?

5voto

Eran Points 35360

Si vous ne vous souciez pas de l'ordre, vous pouvez mapper chaque élément sur une paire d'éléments avec flatMap:

private List getTranslationFilesNames() {
    return SUPPORTED_LANGUAGES.stream()
            .flatMap(lang -> Stream.of(PATH_TO_FILES_WITH_TRANSLATIONS_1 + lang + FILE_EXTENSION,
                                       PATH_TO_FILES_WITH_TRANSLATIONS_2 + lang + FILE_EXTENSION)),
            .collect(Collectors.toList());
}

4voto

tmarwen Points 8715

Au lieu de créer un Stream combiné, vous pouvez simplement utiliser l'opérateur #flatMap pour dupliquer les éléments d'entrée (notez que ceci peut être une solution appropriée seulement si l'ordre des éléments n'a pas d'importance) :

private List getTranslationFilesNames() {
  return SUPPORTED_LANGUAGES.stream()
      .flatMap(s -> Stream.of(
              PATH_TO_FILES_WITH_TRANSLATIONS_1 + s + FILE_EXTENSION,
              PATH_TO_FILES_WITH_TRANSLATIONS_2 + s + FILE_EXTENSION
          )
      )
      .collect(Collectors.toList());
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X