Kotlinにも拘わらず、Javaと同じようにFizzBuzzを解くプログラムをあるブログで見ました
というわけでKotlinの言語機能を活かして美しきFizzBuzzを書いて見たいと思います
ただ、StringBuilderありとなしで結構変わるので今回は2つに場合分けして教えたいと思います
###Kotlinらしくないコード(StringBuilderを使わない場合)
fun main(args: Array<String>) {
for (num in 0..100) {
if (num % 15 == 0)
println("FizzBuzz")
else if (num % 3 == 0)
println("Fizz")
else if (num % 5 == 0)
println("Buzz")
else
println(num)
}
}
###引数を取らない場合はargs: Array<String>
を省略できる
fun main() {
for (num in 1..100) {
if (num % 15 == 0)
println("FizzBuzz")
else if (num % 3 == 0)
println("Fizz")
else if (num % 5 == 0)
println("Buzz")
else
println(num)
}
}
これは多分殆どの人が知ってると思います
###if文をExpressionとして使う
fun main() {
for (num in 1..100) {
println(
if (num % 15 == 0) "FizzBuzz"
else if (num % 3 == 0) "Fizz"
else if (num % 5 == 0) "Buzz"
else num
)
}
}
これはあまり綺麗ではありませんが、Kotlinでの必須テクであるので一応載せました
後述するwhen文と合わせるともうすこし綺麗にできます
###when文を使う
fun main() {
for (num in 1..100) {
when {
num % 15 == 0 -> println("FizzBuzz")
num % 3 == 0 -> println("Fizz")
num % 5 == 0 -> println("Buzz")
else -> println(num)
}
}
}
見た目の美しさが全然違う!
やっぱりif...else-if...を延々と書かなくて済むのは楽ですね。ただしif...if...は作れないので注意です。
fun main() {
for (num in 1..100) {
println(
when {
num % 15 == 0 -> "FizzBuzz"
num % 3 == 0 -> "Fizz"
num % 5 == 0 -> "Buzz"
else -> num
}
)
}
}
ちなみにwhen文もExpressionとして利用可能です
まあ、正直さっきのほうが見やすい気もしますが一応
###Kotlinらしくないコード(StringBuilderを使う場合)
fun main() {
for (num in 1..100) {
val builder = StringBuilder()
if(num % 3 == 0) builder.append("Fizz")
if(num % 5 == 0) builder.append("Buzz")
if(builder.isEmpty()) builder.append(num)
println(builder)
}
}
###buildString関数を使う
fun main() {
for (num in 1..100) {
println(buildString {
if (num % 3 == 0) append("Fizz")
if (num % 3 == 0) append("Buzz")
if (isEmpty()) append(num)
})
}
}
buildString関数めっちゃ便利です。どんなプログラムでもよく使います
でもこれだとbuildStringがprintln関数の引数と使われているので、}の後に)があるのが少しきたないですね
###forEachを使って書き換える
fun main() {
(1..100).map {
buildString {
if (it % 3 == 0) append("Fizz")
if (it % 5 == 0) append("Buzz")
if (isEmpty()) append(it)
}
}.forEach(::println)
}
今までに書いてきた1..100の実体はIntRangeです。これとfor文を組み合わせるのが最も一般的ですが、StreamAPIとその拡張をつかってモダンに書くこともできます
ちなみに::println
はメソッド参照です。メソッドの引数が要求される引数と一致するときに使うことができます。またクラス参照というのもあり、例えばJavaの一部ライブラリとかだとクラスを要求されることがあるので、そういう時KotlinではSomeClass.class
とはできないのでSomeClass::class.java
とします
余談ですが、プロパティを読み込むときとかは
val properties = Properties()
val file = File(filePath)
file.inputStream().use(properties::load)
みたいにすると三行で読み込むことができます。便利!!