如何将流中的内部元素添加到另一个流中?

3
如果我有一个名为Warehouse的类,它保存了不同盒子的列表,放置在此处。 这些盒子可能包含子盒子,在这种情况下,它们的标识以"big"开头,并且它们的列表中包含"small"盒子。
class Warehouse{
    private List<Box> boxes;
}
class Box {
    private String id;
    private List<Box> innerBoxes;
}

next方法返回Warehouse上的Box流。

public Stream<Box> getBoxes();

我如何获取所有在一个仓库且为“大”盒子的箱子? 我尝试了以下方法:
public Stream<Box> getAllBoxes(){
    return getBoxes().stream().filter(b -> b.getId().startsWith("big"));
}

但它仅返回内部框,如何将内部和大框收集在一个流中?

4
“Boxes”类是什么?它是否应该是“Box”类?如果不是,请展示“Box”类。 - Eran
3
为什么人们总是坚持用流式处理做所有的事情?为什么不把两个包含相同元素的列表简单地合并成一个列表呢?你知道如何做到这一点,对吗? - Maarten Bodewes
1
顺便说一下,我认为你可以通过ID区分“大”和“小”盒子很好,但如果这种情况在类设计中没有反映出来,那么对象模型可能存在问题。仅仅有一个不同的ID对我来说似乎是错误的(而且你可以创建一个没有任何盒子的“大”盒子,这可能就是证明)。 - Maarten Bodewes
我不确定您是否允许“大盒子”嵌套在“大盒子”中,像套娃一样。此外,您是要包括这些大盒子还是将它们解开并丢弃?很抱歉有这么多注释;它们是关于不同的问题。 - Maarten Bodewes
如果只是那个型号,Reger05的答案应该可以解决问题。但正如指出的那样,要么您的型号没有意义,要么您的问题不清楚。为什么您想要将内部和外部盒子列在同等地位? - Adrien H
显示剩余5条评论
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接