【问题标题】:Java 8 streams - map element to pair of elementsJava 8 流 - 将元素映射到元素对
【发布时间】:2018-03-06 07:55:21
【问题描述】:

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

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

我觉得这个解决方案不是很优雅。有没有更好的方法来达到同样的效果?

【问题讨论】:

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


    【解决方案1】:

    如果不关心顺序,可以用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 我错过了。我认为这两个 Streams 是相同的。固定的。谢谢。
    【解决方案2】:

    您可以简单地使用#flatMap 操作符来复制输入元素,而不是创建组合的Stream(请注意,这可能是仅当元素顺序无关紧要时才合适的解决方案):

    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 在哪里?
    • 我的错,我已经更新了答案以匹配你的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多