微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何表达*最终*等同于Scala的尝试?

如何使用新的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 举报,一经查实,本站将立刻删除。

相关推荐