下面是我尝试实现一个提供压缩/解压缩字符串功能的类:
object GZipHelper {
def deflate(txt: String): Try[String] = {
try {
val arrOutputStream = new ByteArrayOutputStream()
val zipOutputStream = new GZIPOutputStream(arrOutputStream)
zipOutputStream.write(txt.getBytes)
new Success(Base64.encodeBase64String(arrOutputStream.toByteArray))
} catch {
case _: e => new Failure(e)
}
}
def inflate(deflatedTxt: String): Try[String] = {
try {
val bytes = Base64.decodedBase64(deflatedTxt)
val zipInputStream = GZIPInputStream(new ByteArrayInputStream(bytes))
new success(IOUtils.toString(zipInputStream))
} catch {
case _: e => new Failure(e)
}
}
}
如您所见,finally
关闭的块GZIPOutputStream
and GZIPInputStream
丢失了...我怎样才能以“scala”方式实现这个?我该如何改进代码?
由于您使用的是“老式”try
语句并显式地将其转换为scala.util.Try
,确实没有理由不添加finally
在你之后阻止try
.
但在这种特定情况下,关闭没有什么意义,例如,您的ByteArrayInputStream
- 它并不是真正的开放资源,不需要关闭。在这种情况下,您可以通过以下方式简化代码并使其更加惯用:
def inflate(deflatedTxt: String): Try[String] = Try {
val bytes = Base64.decodedBase64(deflatedTxt)
val zipInputStream = GZIPInputStream(new ByteArrayInputStream(bytes))
IOUtils.toString(zipInputStream)
}
我个人不会声明bytes
and zipInputStream
因为它们只使用一次,但这是一个偏好问题。
这里的技巧是有一个finally
阻止调用scala.util.Try.apply
- 如果不打电话的话我不确定这是否可能map
这实际上并没有改变任何东西,这对我来说似乎有点疏忽。我期待看到一个andThen
or eventually
中的方法scala.util.Try
,但它似乎还不存在(还?)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)