2016-12-06 4 views
6

私はちょうどAndroid用のKotlinを使い始めました(それはSwiftにも役立つことを期待しています)。そしてAndroid JavaコードをKotlinに変換しました。変換の一つでKotlinでBufferedReaderを使用する最善の方法

は、私は次のように私は、通常のJavaで書く(というかC#)となりBufferedReaderの、つまずい:

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

しかしKotlinで、Kotlinにはないようですwhile条件で変数に値を割り当てることができます。 (Kotlinを使用しているにもかかわらず、とPREV-GEN)

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

私はとてもエレガントを見つけることができません:

現在、私は次のようにコードを書いています。

KotlinでBufferedReaderを使用するにはどうすればよいでしょうか?

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

かを次のように

+1

このような文字列を連結しないでください。 'StringBuilder.append()'を使用してください。パフォーマンスの問題があります – rafid059

+0

@ rafid059本当ですか?私は、Javaコンパイラ(とKotlinコンパイラ)がループ内の文字列連結を最適化すると考えました。 –

+1

はい、Javaコンパイラは+ =文字列concatをStringBuilder操作に変換しますが、ここではループ内にあり、コンパイラはループ部分を最適化できません。 'javap -c Main.class'を使用してこのコードを解読すると、ループ内にStringBuilderインスタンスが表示されます。しかし、新しいstringbuilderが毎回最新の 'result'で作成され、' line'が追加されます。 ** TLDR; **コンパイラは単純なfor-loop文字列連結を最適化できません – rafid059

答えて

18

あなたはそれをあなたはまだあなたがSTD libにからいくつかの拡張機能を使用することができます行ずつそれを読みたいと思った場合はそう

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

説明:https://kotlinlang.org/docs/reference/idioms.html#java-7s-try-with-resources – voddan

3

ようbufferedReaderを使用して行うことができます代わりに、「機能的」アプローチを使用します。

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

useLinesを使用すると、明示的に読者のクローズを呼び出す必要がありません、useLinesの拡張機能はあなたのためにそれを行います!

参照用に追加するだけです。歓声

関連する問題