最佳方式

问题描述:

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)) 

我们知道,asigements作为在科特林报表处理,而在Java中,他们作为表达式处理,所以这构造只能在java中使用。

将此java代码转换为kotlin的最佳方法是什么?

而不是字面翻译的代码,使用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

+0

谢谢你的提示。仍然想知道翻译此类代码的最佳方法 –

+0

我扩展了我的答案以涵盖您的原始问题。 –

+1

Kotlin stdlib版本可以使用['URL.readText']进一步简化(https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.net.-url/read-text.html ):'val text = URL(urlSpec).readText()' – mfulton26

你可以使用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); 
}