0

试过这个从文件创建一个序列:

 def getFileAsList(bufferedReader: BufferedReader): Seq[String] ={
        import resource._
        for(source <- managed(bufferedReader)){
            for(line<-source.lines())
                yield line
        }
    }
4

1 回答 1

0

我不认为您以设计使用的方式使用 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.Seqscala.collection.StreamStream

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
}
于 2017-12-02T00:27:29.400 回答