如何使用新的Try API将以下
Java代码转换为Scala?
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的最终等价?
解决方法
由于Try {}块永远不会抛出异常,因此不需要finally语句.此外,对于这种特殊情况,您可能应该使用scala-arm,就像其他海报所建议的那样.
但是,您可以轻松地将一个finally方法添加到Try中,以便在成功或失败的情况下执行副作用.
像这样的东西:
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,因为如果由于某些不可思议的原因,outputStream为null,您将只获得一个Failure(NullPointerException).此外,如果close抛出IOException,您将收到Failure(IOException).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。