我正在使用ARM library将资源文件读入字符串。我正在使用的代码是:
def readResource(reosurceName: String): String = {
val res = for (writer <- managed(new StringWriter);
is <- managed(this.getClass.getClassLoader.getResourceAsStream(resourceName))) yield {
IOUtils.copy(is, writer)
writer.toString
}
res.acquireAndGet(identity)
}
对我来说这看起来有点奇怪,尤其是acquireAndGet
identity
的最后一部分。还有更好的方法吗?
一般的问题是,你将如何使用这种风格来做这样的事情
val x: String=
for (res1 <- managed(...);
res2 <- managed(...);
...
resn <- managed) yield {
f(res1, res2, ..., resn)
}
行为是,如果for comprehension中的操作失败,我希望将异常传播出该方法,并且应该关闭资源。
我在ManagedResource
上看到该地图返回ExtractableManagedResource
,我可以使用opt
方法从中提取结果。 flatMap
仅返回ManagedResource
。有这个原因吗?
答案 0 :(得分:3)
我发现map
和flatMap
的行为方式略有不同,我觉得很奇怪。
也许映射操作可以更自由地暴露无法通过flatMap获得的简化结果。
无论如何,您可以按如下方式构造代码,以获得看起来更具吸引力的内容
def readResource(resourceName: String): Option[String] = {
val managedWriter = {
managed(new StringWriter) and
managed(this.getClass.getClassLoader.getResourceAsStream(resourceName))
} map { case (writer, is) =>
IOUtils.copy(is, writer)
writer.toString
}
}
managedWriter.opt
}
警告:代码未经过测试