我正在学习设计模式,我偶然发现了一个让我感兴趣的任务,但是我没有完成它。我有一个接口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(); }
1条答案
按热度按时间h79rfbju1#
如果你想让flatMap递归的话,你需要嵌套flatMap,最简单的方法是在
Box
接口上提供一个方法,这个方法可以流传输所有嵌套的box:在
BoxContainer
类上,它将迭代其子类:Leaf
类只返回自身:Ideone Demo