考虑这个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)
}
但它非常难看,所以我的问题是,有没有更好的方法来实现我的目标?