必要时一一获取集合元素

时间:2018-07-29 08:36:01

标签: java collections java-stream

我有一个Game类,其中包含一个Board类,其中包含一个ArrayList of Rows。

当前,游戏可以获取getCurrentRow(),并且在游戏进行时可以执行getNextRow()。电路板从错误的一端获取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);
    }
}

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

2 个答案:

答案 0 :(得分:1)

流只能被遍历一次。因此,您无法使其保持打开状态,而无法运行.collect终端操作。

一次检索元素的最佳选择是使用迭代器:

private Iterator<Skinnable> stream; //Please rename the variable

然后使用以下方法在构造函数中创建迭代器:

stream = rowItems.iterator();

检索下一个元素将更改为:

public Row getStreamedRowItem () {

    //you'll need to check if there's a next element
    //if(stream.hasNext())
    return stream.next();
}

答案 1 :(得分:0)

如果我是您,我将遵循JB Nizet的想法,这将为您提供更多的控制空间/机会。

由于您已经拥有rowItems,只需添加另一个index,您就可以在collection中任意飞行。

具有以下内容:

int index; // always pointing to the element to be fetched;

public Board(Game game) { {
    index = 0; // pointing to the first element;
    // or if you want it to point to the last using rowItems.size() - 1 instead;

}

public boolean hasNext() {
    return index < rowItems.size();
}

public Row next() {
    return (Row) rowItems.get(index++);
}

public boolean hasPrevious() {
    return index > -1;
}

public Row previous() {
    return (Row) rowItems.get(index--);
}