TL; DR: Nenhuma sintaxe especial, apenas uma função
O Kotlin, ao contrário do Java, não possui uma sintaxe especial para isso. Em vez disso, tente com recursos , é oferecido como a função de biblioteca padrão use.
FileInputStream("filename").use { fis -> //or implicit `it`
//use stream here
}
As useimplementações
@InlineOnly
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {
var closed = false
try {
return block(this)
} catch (e: Exception) {
closed = true
try {
this?.close()
} catch (closeException: Exception) {
}
throw e
} finally {
if (!closed) {
this?.close()
}
}
}
Esta função é definida como uma extensão genérica em todos os Closeable?tipos. Closeableé a interface do Java que permite tentar com recursos a partir do Java SE7 .
A função aceita literalmente uma funçãoblock que é executada em a try. Igual ao try-with-resources em Java, o Closeableé fechado em um finally.
Além disso, falhas ocorridas no interior blocklevam aclose execuções, onde possíveis exceções são literalmente "suprimidas" simplesmente ignorando-as. Isso é diferente da tentativa com recursos , porque essas exceções podem ser solicitadas na solução do Java .
Como usá-lo
A useextensão está disponível em qualquer Closeabletipo, como fluxos, leitores e assim por diante.
FileInputStream("filename").use {
//use your stream by referring to `it` or explicitly give a name.
}
A parte entre chaves é o que torna-se blockno use(a lambda é passado como um argumento aqui). Após a conclusão do bloqueio, você pode ter certeza de que FileInputStreamfoi fechado.