2017-09-25 4 views
5

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 en conséquence. Je l'ai fait en concaténant deux flux, mais je me demande s'il est possible de le faire plus simplement? Ce que je l'ai fait jusqu'à présent:Java 8 flux - élément de la carte à la paire d'éléments

private List<String> 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. Y a-t-il une meilleure approche pour atteindre le même effet?

Répondre

5

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

private List<String> 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()); 
} 
+0

@Eugene J'ai raté ça. Je pensais que les deux Streams étaient identiques. Fixé. Merci. – Eran

4

Au lieu de créer un combiné Stream, 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<String> 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()); 
} 
+0

où est PATH_TO_FILES_WITH_TRANSLATIONS_1? –

+0

Mon mauvais, j'ai mis à jour la réponse pour répondre à votre question. – tmarwen