如何在java 8流中使用一对多映射?

Fra*_*Xho 8 java java-8 java-stream

map函数中Stream我们可以将一个对象转换为另一个对象,因此我们可以Stream将包含3个A类元素的一个转换为另一个StreamB类型的3个元素.

如何根据条件将3个类型的元素转换A Stream为6个或更多类型的元素B Stream

在代码方面.

我们可以做的

Stream<B> converted = original.map( a -> new B(a) );
Run Code Online (Sandbox Code Playgroud)

但我们怎么能这样做呢?

Steam<B> converted = original.map( a -> { 
    if(a.split()){
        return [ new B(a), new B(a) ];
    }else return new B(a);
});
Run Code Online (Sandbox Code Playgroud)

我无法找到并理解如何做到这一点.谢谢你.

Era*_*ran 9

您可以使用flatMap它将原始元素映射StreamStream某种类型的元素.

Steam<B> converted = original.flatMap( a -> { 
    if(a.split()){
        return Stream.of(new B(a), new B(a));
    } else {
        return Stream.of(new B(a));
    }
});
Run Code Online (Sandbox Code Playgroud)

要么

Steam<B> converted = original.flatMap(a -> a.split() ? 
                                      Stream.of(new B(a), new B(a)) : 
                                      Stream.of(new B(a)));
Run Code Online (Sandbox Code Playgroud)

  • 我个人认为让`split`返回一个`Stream <B>`而不是一个布尔值,然后你可以做`original.flatMap(A :: split)`. (5认同)