C#有using
与IDisposable
接口.Java的7+有相同的功能try
和AutoCloseable
接口.Scala允许您为此问题选择自己的实现.
scala-arm似乎是受欢迎的选择,并由Typesafe员工之一维护.但是,这种简单的行为似乎非常复杂.为了澄清,使用说明很简单,但了解所有代码在内部工作的方式相当复杂.
我刚刚编写了以下超级简单的ARM解决方案:
object SimpleARM {
def apply[T, Q](c: T {def close(): Unit})(f: (T) => Q): Q = {
try {
f(c)
} finally {
c.close()
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何使用新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();
}
}
Run Code Online (Sandbox Code Playgroud)
Scala版本应该是这样的......
def deflate(data Array[Byte]): Try[Array[Byte]] = Try {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream()
new GZIPOutputStream(outputStream).write(data)
outputStream.toByteArray
}
Run Code Online (Sandbox Code Playgroud)
...但是如何实现Java的finally
等效?