Java 8流 - 将元素映射到元素对

时间:2017-09-25 11:01:18

标签: java functional-programming java-8 stream java-stream

我有一系列元素。我想将每个元素映射到两个相同类型的不同元素,以便我的流将是两倍长。 我通过连接两个流来做到这一点,但我想知道是否可以做到这一点更简单? 到目前为止我做了什么:

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 个答案:

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