2016-12-06 19 views
6

Bu yüzden Android için Kotlin'i kullanmaya başladım (Swift ile de bana yardımcı olabileceğini umarak) ve Android Java kodlarımı Kotlin'e dönüştürdüm. Kotlin'de BufferedReader'ı kullanmanın en iyi yolu

String result = ""; 
String line = ""; 
BufferedReader reader = new BufferedReader(someStream); 
while ((line = reader.readLine()) != null) { 
    result += line; 
} 

Ama KOTLIN içinde

, Kotlin değil gibi görünüyor: Aşağıdaki gibi dönüşümlere birinde

, ben genellikle Java (daha doğrusu C#) 'de yazardım bir BufferedReader, tökezledi Koşullarda değişkenlere değer atamamı sağlayın. (KOTLIN kullanarak rağmen ve önceki-gen)

val reader = BufferedReader(someStream) 
var line : String? = "" 
while (line != null) { 
    line = reader.readLine() 
    result += line 
} 

Çok zarif bulmuyorum:

Şu anda, aşağıdaki gibi kod yazdım.

Kotlin'de BufferedReader'ı kullanmanın en iyi yolu ne olurdu?

val reader = someStream.bufferedReader() 
val iterator = reader.linesSequences().iterator() 
while(iterator.hasNext()) { 
    val line = iterator.next() 
    // do something with line... 
} 
reader.close() 

veya şu şekildedir:

+1

Bunun gibi dizeleri birleştirmeyin. 'StringBuilder.append()' işlevini kullanın. Performans sorunları var – rafid059

+0

@ rafid059 Gerçekten mi? Java derleyicileri (ve böylece Kotlin derleyicisi) döngü dizgelerini döngüler halinde optimize ettiklerini düşündüm. –

+1

Evet, java derleyici bir + = string concat'ı StringBuilder işlemine dönüştürür, ancak burada bir döngü içinde ve derleyici döngü bölümünü optimize edemez. Bu kodu 'javap -c Main.class' kullanarak çözerseniz, döngü içinde bir StringBuilder örneği görürsünüz. Ancak her zaman en son 'sonuç 'ile yeni bir dizgi oluşturucu oluşturulur ve sonra' satır 'buna eklenir. ** TLDR; ** derleyici basit bir for-loop dize birleştirme için optimize edemezsiniz – rafid059

cevap

18

Bunu hala std lib bazı uzatma işlevlerini kullanabilirsiniz satır satır okumak istiyorsa o kadar

val allText = inputStream.bufferedReader().use(BufferedReader::readText) 
+1

Bir açıklama: https://kotlinlang.org/docs/reference/idioms.html#java-7s-try-with-resources – voddan

3

gibi bufferedReader kullanabilir ve yapabileceği alternatif olarak bir "işlevsel" bir yaklaşım kullanarak: useLines kullanarak

val reader = someStream.bufferedReader() 
reader.useLines { 
    it.map { line -> // do something with line } 
} 

, sen don' t Okuyucuyu açık bir şekilde kapatmaya ihtiyaç duyduğunuzda, useLines eklenti işlevi sizin için bunu yapacaktır!

Yalnızca başvuru için ekleyenler .. alkışlar