gpt4 book ai didi

scala - 如何表达 Scala 的 Try 的 *finally* 等价物?

转载 作者:行者123 更新时间:2023-12-04 23:02:10 36 4
gpt4 key购买 nike

如何使用新的 Try 将以下 Java 代码转换为 Scala API?

public byte[] deflate(byte[] data) {

ByteArrayOutputStream outputStream = null;
GZIPOutputStream gzipOutputStream = null;

try {
outputStream = new ByteArrayOutputStream();
gzipOutputStream = new GZIPOutputStream(outputStream);
gzipOutputStream.write(data);
return outputStream.toByteArray();
catch (Exception e) {
...
} finally {
if (gzipOutputStream != null) gzipOutputStream.close();
}
}

Scala 版本应该是这样的......
def deflate(data Array[Byte]): Try[Array[Byte]] = Try {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream()
new GZIPOutputStream(outputStream).write(data)
outputStream.toByteArray
}

...但是我如何实现 Java 的 finally相等的?

最佳答案

由于 Try {} 块永远不会抛出异常,因此不需要 finally 语句。此外,对于这种特殊情况,您可能应该使用 scala-arm,就像其他海报所建议的那样。

但是您可以轻松地向 Try 添加一个 finally 方法,该方法在成功或失败的情况下执行副作用。

像这样的东西:

implicit class TryHasFinally[T](val value:Try[T]) extends AnyVal { 
import scala.util.control.NonFatal

def Finally(action: => Unit) : Try[T] =
try {
action;
value
} catch {
case NonFatal(cause) => Failure[T](cause)
}
}

请注意,本着 Try 的所有方法的精神,如果您的操作抛出非致命异常,则不会抛出异常,而只是将其捕获为失败。

你会像这样使用它:
import java.io._
import java.util.zip._

def deflate(data: Array[Byte]): Try[Array[Byte]] = {
var outputStream : ByteArrayOutputStream = null
Try {
outputStream = new ByteArrayOutputStream()
new GZIPOutputStream(outputStream).write(data)
outputStream.toByteArray
} Finally {
outputStream.close()
}
}

请注意,您不必在Finally 中检查null,因为如果由于某种深不可测的原因输出流为null,您将只会得到一个Failure(NullPointerException)。此外,如果 close 抛出 IOException,您只会得到一个 Failure(IOException)。

关于scala - 如何表达 Scala 的 Try 的 *finally* 等价物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20632250/

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