确保对scala流进行顺序评估

时间:2017-05-26 19:24:52

标签: scala stream

考虑这个scala函数,该函数接受服务器套接字并根据accept方法将其转换为套接字流:

def accepting(ss: ServerSocket): Stream[Socket] =
   try { Stream.cons(ss.accept(), accepting(ss)) }
   catch { Stream.empty }

如果对此流进行左右评估,它将正常运行。但由于数据来源是基于副作用,因此对项目的正确评估取决于已评估的所有先前项目,并且仅评估了之前的项目。

例如,如果我要跳过流中的前10个项目,然后取下一个项目,我希望它返回第11个套接字以连接到此服务器套接字,但它实际上将返回第一个。因此,我需要的是确保在评估任何给定项目之前评估所有先前项目的方法。

我想出的最佳解决方案是:

def accepting(ss: ServerSocket): Stream[Socket] = {
  def accepting(ss: ServerSocket, previous: Option[Socket]): Stream[Socket] = {
    try {
      lazy val current = ss.accept()
      Stream.cons(current, accepting(ss, Some(current)))
    } catch { Stream.empty }
  }
  accepting(ss, None)
}

但它非常难看,所以我的问题是,有没有更好的方法来实现我的目标?

0 个答案:

没有答案