为了账号安全,请及时绑定邮箱和手机立即绑定

需要时一一获取集合元素

需要时一一获取集合元素

临摹微笑 2021-06-15 09:14:48
我有一个类 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();

}


查看完整回答
反对 回复 2021-06-17
  • 2 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信