Java 8流 - 将元素映射为一对元素

5

我有一组元素。我想将每个元素映射到同一类型的两个不同元素,以便我的流会因此变长两倍。 我通过连接两个流来实现这一点,但我想知道是否可以更简单地实现这一点? 到目前为止,我已经做了:

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

我不认为这种解决方案很优雅。有更好的方法来实现相同的效果吗?
2个回答

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

@Eugene,我错过了那个。我以为这两个流是相同的。已经修复了。谢谢。 - 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());
}

PATH_TO_FILES_WITH_TRANSLATIONS_1 在哪里? - k13i
我的错,我已经更新答案以匹配你的问题。 - tmarwen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接