我正在使用ARM库将资源文件读入字符串.我正在使用的代码是这样的:
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)
}
Run Code Online (Sandbox Code Playgroud)
它看起来有点怪我,尤其是最后一部分acquireAndGet的identity.有没有更好的办法 ?
一般的问题是,你将如何使用这种风格来做这样的事情
val x: String=
for (res1 <- managed(...);
res2 <- managed(...);
...
resn <- managed) yield {
f(res1, res2, ..., resn)
}
Run Code Online (Sandbox Code Playgroud)
行为是,如果for comprehension中的操作失败,我希望将异常传播出该方法,并且应该关闭资源.
我在ManagedResource返回的地图上看到了这个地图ExtractableManagedResource,我可以使用该opt方法从中提取结果.flatMap只返回一个ManagedResource.是否有一个原因 ?
我也觉得很奇怪,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
}
Run Code Online (Sandbox Code Playgroud)
警告:代码未经测试
| 归档时间: |
|
| 查看次数: |
575 次 |
| 最近记录: |