var str: String
while(( str = reader.readLine()) != null ) { // <== コンパイルエラーになる
// 処理
}
次のようにする
var str: String
str = reader.readLine()
while( str != null ) {
// 処理
str = reader.readLine()
}
次のような方法とか!
var str: String? = null
while( reader.readLine().let{ str = it; it != null } ) {
println( str )
}
次のような方法もある!
var str: String? = null
while( run{ str = reader.readLine(); str != null } ) {
println( str )
}
次のような方法もあるが、コンパイルすると、匿名クラス(classファイル)が作成されるので多用する場合は注意
var str: String? = null
while( { str = reader.readLine(); str }() != null ) {
println( str )
}
for( i in 0..2 ) { print( "$i, ") }
==> 0, 1, 2,
( 0..2 ).forEach { print( "$it, ") }
==> 0, 1, 2,
repeat(3) { print( "$it, " )}
==> 0, 1, 2,
for( i in 1..10 step 5) println( i )
==> 1, 3, 5
(1..5 step 2).forEach{ println( it ) }
==> 1, 3, 5
for( i in 3 downTo 1 ) println( i )
==> 3, 2, 1
( 3 downTo 1 ).forEach{ println( it ) }
==> 3, 2, 1
for( i in 5 downTo 1 step 2 ){ println( i ) }
==> 5, 3, 1
( 5 downTo 1 step 2 ).forEach{ println( it ) }
==> 5, 3, 1
5 downTo 1 step 2 の IntProgression は Iterable なので、forEach の他にも map などのファンクションが使える
Int.downTo は IntProgression を返す
step は IntProgression のプロパティ
whileループの中から一定の条件になった時、戻り値を返す
(目的・条件)
(例) WEBサーバから受信したヘッダの Last-Modified ヘッダの日付を返す 10回リトライして接続できない場合は例外をスローする => つまり null は返さない
fun getLastModified( url: String ): Date {
var retryCount = 0
while( true ) {
try {
val conn = URL( url ).openConnection()
println( conn.inputStream.reader().use() { it.readText() }
return Date( conn.lastModified )
} catch( ex: Exception ) {
if( retryCount == 10 ) {
throw ex
}
println( ex.message )
}
}
}
fun test {
val list = listOf( 1, 2, 3 )
// forEach の中で continue はコンパイルエラー
list.forEach{
if( it == 2 ) continue
println( it )
}
// forEach の中で break もコンパイルエラー
list.forEach{
if( it == 2 ) break
println( it )
}
// forEach の中で return@forEach を使うと直近の forEach に対する cotinue として使える
list.forEach{
if( it == 2 ) return@forEach
println( it )
}
// for ループだと continue は問題なく使える
for( ii in list ) {
if( ii == 2 ) continue
println( ii )
}
// for ループだと break も問題なく使える
for( ii in list ) {
if( ii == 2 ) break
println( ii )
}
// forEach の中でラベル(@forEach)なしで return を指定すると、このメソッドを抜ける
list.forEach{
if( it == 2 ) return
println( it )
}
}
fun normalReturn()
{
val lst = listOf(1,2,3,4,5)
lst.forEach{ ii->
lst.forEach{ jj->
if( jj % 2 == 0 ) return
println( "${ii} : ${jj}" )
}
}
}
fun labelReturn1()
{
val lst = listOf(1,2,3,4,5)
lst.forEach{
if( it % 2 == 0 ) return@forEach
println( it )
}
println("-- labelReturn1 end")
}
fun labelReturn2()
{
val lst = listOf(1,2,3,4,5)
lst.forEach loop1@ { ii->
lst.forEach loop2@ { jj->
if( jj % 2 == 0 ) return@loop2
println( "${ii} : ${jj}" )
}
}
}
fun labelReturn3()
{
val lst = listOf(1,2,3,4,5)
lst.forEach loop1@ { ii->
lst.forEach loop2@ { jj->
if( jj % 2 == 0 ) return@loop1
println( "${ii} : ${jj}" )
}
}
}
fun labelReturn4(lst: List<Int>)
{
val lst = listOf(1,2,3,4,5)
lst.forEach{ ii->
lst.forEach( fun(jj: Int) {
if( jj % 2 == 0 ) return
println( "${ii} : ${jj}" )
})
}
}
fun labelReturn5(lst: List<Int>)
{
val lst = listOf(1,2,3,4,5)
lst.forEach( fun(ii: Int) {
lst.forEach{ jj->
if( jj % 2 == 0 ) return
println( "${ii} : ${jj}" )
}
})
}
run brk@ {
Files.newDirectoryStream(Paths.get("/tmp"),"*.txt").use(){
it.forEach{ path ->
println(path)
return@brk
}
}
}
/tmp ディレクトリで最初に見つかったファイル名だけが表示される
fun main(args: Array<String>) {
var cnt = 0
exit@ while(true) {
cnt = cnt + 1
when(cnt) {
3 -> { continue@exit } // while ループの先頭に戻る
5 -> { break@exit } // while ループを抜ける
}
println( cnt )
Thread.sleep(1000)
}
println( "exit at $cnt" )
}
fun main(args: Array<String>)
{
val hoge1 = "hoge"
val hoge2 = 1
sub(hoge1, hoge2)
}
fun sub(obj1: Any, obj2: Any)
{
when(obj1)
{
is String, is Int -> println("String/Int")
else -> println("other")
}
when
{
obj2 is String || obj2 is Int -> println("String/Int")
else -> println("other")
}
}
import java.net.*
fun main( args: Array<String> ) {
val str: String = try {
URL("http://www.hoge.org/").readText() // HTTPサーバから受信した文字列を返す
} catch( ex: ConnectException) {
ex.printStackTrace()
return // ConnectionTimeout が発生したら、処理を抜ける(str に文字列はセットされない)
// return しておかないと、コンパイルエラーが出る(Unit を String に代入できない。Unit は printStackTrace() の戻り値)
// それ以外の例外が発生した場合は、処理が中断される
}
println( str )
}
BufferedReader( FileReader( "hoge.txt" )).use { reader ->
var line = reader.readLine()
while( line != null ) {
println(line)
line = reader.readLine()
}
}
「reader ->」を省略して it を使ってもよい