2017-09-25 149 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