Java 8:扁平化 Stream<Stream>

Som*_*kar 4 java java-8 java-stream

我想在指定年份之间的一年中在 Quarter 上做一个笛卡尔积

Year(2105, 2016) 应该返回 Quarter(2015, Q1), Quarter(2015, Q2)... Quarter(2016, Q4)

代表季度的枚举将是

public enum Quarters {
    Q1, Q2, Q3, Q4
}
Run Code Online (Sandbox Code Playgroud)

我试图想出的代码卡在下面

IntStream.rangeClosed(this.getYear(), to.getYear())
    .boxed()
    .map(i -> Arrays
        .stream(Quarters.values())
        .map(q -> new Quarter(i, q))
    );
Run Code Online (Sandbox Code Playgroud)

上面的代码返回Stream<Stream<Quarter>>,我需要扁平化为Stream<Quarter>任何帮助表示赞赏。

Era*_*ran 5

您可以使用flatMap您的拼合Stream<Stream<Quarter>>Stream<Quarter>

IntStream.rangeClosed(this.getYear(), to.getYear())
    .boxed()
    .map(i -> Arrays
        .stream(Quarters.values())
        .map(q -> new Quarter(i, q))
        .flatMap(Function.identity())
    );
Run Code Online (Sandbox Code Playgroud)

的主体flatMap只是一个身份函数。

或者,正如亚历克西斯建议的那样,您可以直接使用flatMap代替map

IntStream.rangeClosed(this.getYear(), to.getYear())
    .boxed()
    .flatMap(i -> Arrays
        .stream(Quarters.values())
        .map(q -> new Quarter(i, q))
    );
Run Code Online (Sandbox Code Playgroud)

  • 只需使用 `flatMap(...)` 而不是 `map(...).flatMap(identity())` (6认同)
  • @SomasundaramSekar 我的错误。第一个片段应该使用`Function.identity()`,而不是方法引用。无论如何,第二个片段更好。 (2认同)

归档时间:

查看次数:

4249 次

最近记录:

7 年,11 月 前