猿问

需要时一一获取集合元素

我有一个类 Game,其中包含一个类 Board,其中包含一个 ArrayList 的行。


目前 Game 可以 getCurrentRow() 并且当游戏进行时它会执行 getNextRow()。Board 获取 currentRow,从错误的一端循环遍历 ArrayList,并在每个步骤中将该行保存在 lastCheckedRow 中,并在找到 currentRow 时中断。nextRow 将变为 lastCheckedRow。很简单,但是很丑。


我想将这种方法改为流。是否可以创建一个仍可访问的流,并且在调用时一次只返回一个元素?


public class Board implements Skinnable{


    private Stream<Skinnable> stream;


    protected List<Skinnable> rowItems = new ArrayList<>();


    private BoardRow currentRow;


    private final BoardSkin skin;


    public Board(Game game) {


        for (int i = 0; i < 10; i++) {

            rowItems.add(new BoardRow(game));

            if (i == 9) {

                setCurrentRow((BoardRow) rowItems.get(rowItems.size() - 1));

            }

        }


        stream = rowItems.stream();

        skin = new BoardSkin(this);

    }


    public void setCurrentRow(BoardRow row) {

        currentRow = row;

        currentRow.activate();

    }


    public Row getStreamedRowItem () {


        List<Skinnable> collect = stream.limit(1).collect(Collectors.toList());


        return (Row) collect.get(0);

    }

}

这是有效的,一次,然后流被关闭。这更像是一个普遍的问题。我已经在这里和其他地方进行了搜索,但这对我来说太新了,所以我什至无法正确表达我的问题,因此我被卡住了。


临摹微笑
浏览 107回答 2
2回答

杨魅力

流只能被遍历一次。因此,您不能保持打开状态并运行.collect终端操作。一次检索元素的最佳替代方法是使用迭代器:private Iterator<Skinnable> stream; //Please rename the variable然后在构造函数中创建迭代器:stream = rowItems.iterator();检索下一个元素更改为:public Row getStreamedRowItem () {&nbsp; &nbsp; //you'll need to check if there's a next element&nbsp; &nbsp; //if(stream.hasNext())&nbsp; &nbsp; return stream.next();}
随时随地看视频慕课网APP

相关分类

Java
我要回答