(1..100).forEach {
val str = when (Pair(it % 3 == 0, it % 5 == 0)) {
Pair(false, false) -> it
Pair(true, false) -> "Fizz"
Pair(false, true) -> "Buzz"
else -> "FizzBuzz"
}
println(str)
}
KotlinはPair
, Triple
でタプルを表現するのでこういう書き方ができます。
もしくは
(1..100).asSequence().map {
when (Pair(it % 3 == 0, i % 5 == 0)) {
Pair(false, false) -> it
Pair(true, false) -> "Fizz"
Pair(false, true) -> "Buzz"
else -> "FizzBuzz"
}
}.forEach(::println)
asSequence()
でLazy evaluationが可能となり、1要素毎にprintlnしてくれます。
もしasSequence()
を付けずに実装してしまうと、(1..1000000000)
のような巨大なループにした場合にEager evaluationな実装となってしまい、1000000000回mapのループを実行した後にまとめてprintlnしようとするためjava.lang.OutOfMemoryError
となってしまいます。
to
関数を使うとこんな書き方もできます。
(1..100).asSequence().map { i ->
when ((i % 3 == 0) to (i % 5 == 0)) {
false to false -> i
true to false -> "Fizz"
false to true -> "Buzz"
else -> "FizzBuzz"
}
}.forEach(::println)
to
関数はPair
を作るための関数です。が、ちょっとわかりにくいですね💦