如何将内部元素从流添加到流?

Khi*_*ian 3 java java-8 java-stream

如果我有Warehouse包含不同框列表的类,则放置在这里。盒子里面可以有盒子,在这种情况下,它们的 id 以“big”开头,它们的 List 由“small”盒子组成

class Warehouse{
    private List<Box> boxes;
}
class Box {
    private String id;
    private List<Box> innerBoxes;
}
Run Code Online (Sandbox Code Playgroud)

下一个方法返回StreamBox是在上课Warehouse

public Stream<Box> getBoxes();
Run Code Online (Sandbox Code Playgroud)

我如何获得所有盒子,即一个仓库和“大”盒子?我试过下一个方法

public Stream<Box> getAllBoxes(){
    return getBoxes().stream().filter(b -> b.getId().startsWith("big"));
}
Run Code Online (Sandbox Code Playgroud)

但是它只返回内盒,如何在一个流中收集内盒和大盒?

小智 5

如果你试图在流中收集内部和大盒子,你可以使用 stream.of() 和 stream.concat();

public Stream<Box> flattened() {
        return Stream.concat(
                Stream.of(this),
                innerBoxes.stream().flatMap(Box::flattened));
    }

Run Code Online (Sandbox Code Playgroud)

关于这方面的更多信息可以在这里找到 http://squirrel.pl/blog/2015/03/04/walking-recursive-data-structures-using-java-8-streams/

一旦该方法存在于您的 Box 类中,您就可以调用

warehouse.boxes.stream().flatMap(Box::flattened); //Collect as needed
Run Code Online (Sandbox Code Playgroud)