我有一系列元素。我想将每个元素映射到两个相同类型的不同元素,以便我的流将是两倍长。 我通过连接两个流来做到这一点,但我想知道是否可以做到这一点更简单? 到目前为止我做了什么:
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());
}
我发现这个解决方案并不优雅。是否有更好的方法来达到同样的效果?
答案 0 :(得分: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());
}
答案 1 :(得分:4)
您可以简单地使用Stream
运算符复制输入元素,而不是创建合并的#flatMap
(请注意,只有在元素顺序无关紧要时,这可能是一个合适的解决方案):< / p>
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());
}