5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Kotlinで美しきFizzBuzzを書く

Last updated at Posted at 2019-03-01

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)

みたいにすると三行で読み込むことができます。便利!!

5
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?