如何从使用托管打开的文件创建seq的字符串?

时间:2017-12-01 22:35:35

标签: scala io scala-arm

尝试从文件创建seq:

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

1 个答案:

答案 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转换为Tryget,这样可以获得结果或(重新)抛出结果计算过程中发生的异常

另请注意,java.util.Stream是一只与scala.collection.Seqscala.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
}