2017-09-25 148 views
5

我有一個元素流。我想將每個元素映射到相同類型的兩個不同元素,以便我的流將延長兩倍。 我通過連接兩個流來實現這一點,但我想知道是否可以做到這一點更簡單? 什麼我迄今所做的:Java 8流 - 將元素映射到元素對

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

我不覺得這種解決方案非常優雅。有更好的方法來達到同樣的效果嗎?

回答

5

如果你不關心的順序,你可以用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我錯過了。我認爲這兩個Streams是相同的。固定。謝謝。 – Eran

4

而是創建一個組合的Stream的,你可以簡單地使用#flatMap操作複製輸入元素(注意,這可能是一個合適的解決方案,只有當元素順序無關緊要時):

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

其中是PATH_TO_FILES_WITH_TRANSLATIONS_1? –

+0

我的不好,我已經更新了答案以配合你的問題。 – tmarwen