试过这个从文件创建一个序列:
def getFileAsList(bufferedReader: BufferedReader): Seq[String] ={
import resource._
for(source <- managed(bufferedReader)){
for(line<-source.lines())
yield line
}
}
我不认为您以设计使用的方式使用 Scala-ARM。问题是,除非您使用命令式样式,即在适当的位置使用您的托管资源,否则您将使用 Monadic 样式,因此您得到的是包装到延迟(延迟)计算而不是立即结果的结果。所以这不是Java try-with-resource 结构的直接替代品。如果您有一个方法想要返回一些恰好也被管理的惰性资源,即在使用后需要某种显式关闭,则一元样式更有用。但这意味着托管资源是在方法内部创建的,而不是像您的情况那样从外部传递。ExtractableManagedResource
你仍然可以通过类似的结构实现类似于你想要的东西
def getFileAsList(bufferedReader: BufferedReader): java.util.stream.Stream[String] = {
import resource._
val managedWrapper = for (source <- managed(bufferedReader))
yield for (line <- source.lines())
yield line
managedWrapper.tried.get
}
该tried
方法转换ExtractableManagedResource
为 a Try
,然后get
将获得结果或(重新)抛出结果计算期间发生的异常。
另请注意,这是与orjava.util.Stream
完全不同的野兽。如果你想获得 Scala 特定的,你应该使用一些 Scala 特定的代码,例如scala.collection.Seq
scala.collection.Stream
Stream
def getFileAsList(bufferedReader: BufferedReader): scala.collection.immutable.Stream[String] = {
import resource._
val managedWrapper = for (source <- managed(bufferedReader))
yield Stream.continually(source.readLine()).takeWhile(_ != null)
managedWrapper.tried.get
}