我有一个类 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); }}这是有效的,一次,然后流被关闭。这更像是一个普遍的问题。我已经在这里和其他地方进行了搜索,但这对我来说太新了,所以我什至无法正确表达我的问题,因此我被卡住了。
2 回答
杨魅力
TA贡献1811条经验 获得超6个赞
流只能被遍历一次。因此,您不能保持打开状态并运行.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();
}
添加回答
举报
0/150
提交
取消