我如何表达*最终*等同于Scala的尝试?
发布时间:2020-12-16 09:53:34 所属栏目:安全 来源:网络整理
导读:如何使用新的Try API将以下 Java代码转换为Scala? public byte[] deflate(byte[] data) { ByteArrayOutputStream outputStream = null; GZIPOutputStream gzipOutputStream = null; try { outputStream = new ByteArrayOutputStream(); gzipOutputStream =
如何使用新的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). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 阻止使用AngularJs和Node.js / Express直接访问文件
- Azure Stack运维工具Azure Stack Tools的使用及实战
- 如何在bash shell中编写一个优雅的linux命令
- 2017年,前端开发市场饱和了么
- Msysgit bash在Windows 7中非常缓慢
- VisualBox&Vagrant搭建laravel开发环境
- 休息 – Angular2 http post – 如何发送授权头?
- 报错:Couldn't register with the bootstrap server
- bash – 在终端中检测可用颜色的最优雅方式是在vim中使用co
- Redis Cluster探索与思考