将这个java代码翻译成kotlin的最佳方法

时间:2016-08-23 11:04:42

标签: kotlin

URL url = new URL(urlSpec);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
InputStream in = connection.getInputStream();
int bytesRead = 0;
byte[] buffer = new byte[1024];
while ((bytesRead = in.read(buffer)) > 0) {
    out.write(buffer, 0, bytesRead);
}
out.close();

我对这部分特别好奇

while(bytesRead = in.read(buffer))

我们知道,在kotlin中,asigements被视为语句,而在java中,它们被视为表达式,因此这种结构只能在java中使用。

将这个java代码翻译成kotlin的最佳方法是什么?

3 个答案:

答案 0 :(得分:10)

不是按字面翻译代码,而是使用Kotlin的stdlib,它提供了许多有用的扩展功能。这是一个版本

val text = URL(urlSpec).openConnection().inputStream.bufferedReader().use { it.readText() }

回答原始问题:你是对的,作业不被视为表达。因此,您需要将分配和比较分开。看一下stdlib中的实现示例:

public fun Reader.copyTo(out: Writer, bufferSize: Int = DEFAULT_BUFFER_SIZE): Long {
    var charsCopied: Long = 0
    val buffer = CharArray(bufferSize)
    var chars = read(buffer)
    while (chars >= 0) {
        out.write(buffer, 0, chars)
        charsCopied += chars
        chars = read(buffer)
    }
    return charsCopied
}

来源:https://github.com/JetBrains/kotlin/blob/a66fc9043437d2e75f04feadcfc63c61b04bd196/libraries/stdlib/src/kotlin/io/ReadWrite.kt#L114

答案 1 :(得分:3)

您可以使用apply块来执行分配:

val input= connection.getInputStream();
var bytesRead = 0;
val buffer = ByteArray(1024)
while (input.read(buffer).apply { bytesRead = this } > 0) {
    out.write(buffer, 0, bytesRead);
}

答案 2 :(得分:0)

  

你可以使用这样的东西

由于每次迭代都会创建一个函数,因此此操作可能会很重。

val url = URL("urlSpec")
val connection = url.openConnection() as HttpURLConnection
val `in` = connection.inputStream
val buffer = ByteArray(1024)
var bytesRead: Int? = null
while ({ bytesRead = `in`.read(buffer); bytesRead }() != null) {
        out.write(buffer, 0, bytesRead!!)
}
out.close()