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