尝试从文件创建seq:
def getFileAsList(bufferedReader: BufferedReader): Seq[String] ={
import resource._
for(source <- managed(bufferedReader)){
for(line<-source.lines())
yield line
}
}
答案 0 :(得分:0)
我认为您不会以设计使用的方式使用Scala-ARM。问题是,除非你使用Imperative style即消耗你的托管资源,你使用Monadic风格,所以你得到的结果是包裹到ExtractableManagedResource
这是一个 延迟(延迟)计算 而不是立即结果。所以这不是Java try-with-resource构造的直接替代品。如果你有一个方法想要返回一些也恰好被管理的懒惰资源,即在使用后需要某种显式关闭,那么Monadic风格会更有用。但这意味着托管资源是在方法内创建的,而不是像在你的情况下那样从外部传递。
你仍然可以通过像
这样的结构实现类似于你想要的东西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
转换为Try
和get
,这样可以获得结果或(重新)抛出结果计算过程中发生的异常
另请注意,java.util.Stream
是一只与scala.collection.Seq
或scala.collection.Stream
完全不同的野兽。如果您想获得特定于Scala的Stream
,您应该使用一些特定于Scala的代码,例如
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
}