java 复合图案中的平面图

bksxznpy  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(119)

我正在学习设计模式,我偶然发现了一个让我感兴趣的任务,但是我没有完成它。我有一个接口Box,它有两个扩展类,让我们称之为Leaf和BoxContainer。我尝试做这样的事情:

List<Box> boxContainer = new BoxContainer(new Leaf("red","fresh"),
                                                new Leaf("white","dry"),
                                                new Leaf("black","dry"),
                                                new Leaf("green", "fresh"),
                                                new BoxContainer(("red","fresh"),
                                                new Leaf("white","dry"),
                                                new Leaf("black","dry"),
                                                new Leaf("green", "fresh"),)));

我实现的一个方法需要将列表扁平化为一个长列表,因为当我尝试对列表的大小求和时,它给了我5,而不是我期望得到的8,因为一个盒子里面有8片叶子-- 4片在外面,另外4片在BoxContainer里面。我尝试使用flatmap是因为我希望该方法能够在一个BoxContainer中扁平化多个BoxContainer,我的意思是我希望能够传递一个框中的框中的框,等等,据我所知,平面Map应该能帮助我做到这一点。问题是,当我尝试这个的时候:

List<Box> getBoxes() {
        List<Box>flat= allBoxes.stream().flatMap(List::stream).collect(Collectors.toList());

List::stream给我错误“不能从静态上下文引用非静态方法”
有什么办法可以绕过它,或者我的实施和简单的想法是坏的,我应该用其他的方式去做?
我尝试了一些lambda解决方案,也浏览了这个问题的其他示例,但没有找到任何可以在自己的代码中实现的东西
@编辑

class BoxContainer implements Box{
     List<Box> allBoxes= new ArrayList<>();
    String color;
    String state;

    public BoxContainer(Box... boxes) {
        allBoxes.addAll(Arrays.asList(boxes));
    }

对于类/接口定义:

interface Box { String getColor(); String getState(); }
h79rfbju

h79rfbju1#

如果你想让flatMap递归的话,你需要嵌套flatMap,最简单的方法是在Box接口上提供一个方法,这个方法可以流传输所有嵌套的box:

Stream<Leaf> leaves();

BoxContainer类上,它将迭代其子类:

@Override
Stream<Leaf> leaves() {
    return allBoxes.stream().flatMap(Box::leaves);
}

Leaf类只返回自身:

@Override
Stream<Leaf> leaves() {
    return Stream.of(this);
}

Ideone Demo

相关问题