gpt4 book ai didi

scala - Scala 中的数据压缩

转载 作者:行者123 更新时间:2023-12-04 22:12:49 28 4
gpt4 key购买 nike

下面是我尝试实现一个提供压缩/解压缩字符串功能的类:

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)
}
}
}

如您所见,关闭 finallyGZIPOutputStreamGZIPInputStream 块丢失了……我如何以“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)
}

我个人不会声明 byteszipInputStream 因为它们只使用一次,但这是一个偏好问题。

这里的诀窍是使用 finally 块调用 scala.util.Try.apply - 我不确定如果不通过调用 map 实际上没有修改任何东西,这是否可能,这对我来说似乎有点疏忽。我期待在 andThen 中看到 eventuallyscala.util.Try 方法,但它似乎不存在(还没有?)。

关于scala - Scala 中的数据压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20614343/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com