如何在流之间添加内部元素?

时间:2019-12-16 14:07:13

标签: 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;
}

next方法返回StreamBox个对象中的Warehouse

public Stream<Box> getBoxes();

我如何获得所有一个仓库和“大”盒子中的盒子? 我尝试过另一种方式

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

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

1 个答案:

答案 0 :(得分:5)

如果您试图同时收集内部和大盒子,则可以使用stream.of()和stream.concat();

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

有关此的更多信息,请参见此处 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