Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

#37 Kotlin Koans Builders/String and map builders 解説

1 はじめに

Kotlin公式リファレンスのKotlin Koans Builders/String and map buildersの解説記事です。

Kotlin Koansを通してKotlinを学習される人の参考になれば幸いです。

ただし、リファレンスを自力で読む力を養いたい方は、
すぐにこの記事に目を通さないで下さい!

一度各自で挑戦してから、お目通し頂ければと思います:fist:

2 StringBuilderを用いた文字列の連結

Kotlinにおける文字列の連結方法の1つにStringBuilderインスタンスを用いる方法があります。

以下の手順で利用します。

  1. StringBuilderインスタンスを生成する。
  2. StringBuilderインスタンスがappend()を呼び出して、引数として連結したい文字列を渡す。
  3. StringBuilderインスタンスがtoString()を呼び出して、戻り値として連結した文字列を返す。

例を見てみましょう。

Stringbuilder_Example
fun main(){
  val sb = StringBuilder()
  sb.append("G")
  sb.append("o")
  sb.append("o")
  sb.append("d")
  println(sb.toString())
}

上の例の実行結果は、Goodとなります。

3 Builders/String and map builders の解説

Kotlin Koans Builders/String and map buildersの解説です。
随時本サイトの内容を引用させていただきます。

本文とコードを見てみましょう。

Extension function literals are very useful for creating builders, e.g.:

Example
fun buildString(build: StringBuilder.() -> Unit): String {
    val stringBuilder = StringBuilder()
    stringBuilder.build()
    return stringBuilder.toString()
}

val s = buildString {
    this.append("Numbers: ")
    for (i in 1..3) {
        // 'this' can be omitted
        append(i)
    }
}

s == "Numbers: 123"

Add and implement the function 'buildMutableMap' with one parameter (of type extension function) creating a new HashMap, building it and returning it as a result. The usage of this function is shown below.

String_and_map_builders
import java.util.HashMap

/* TODO */

fun usage(): Map<Int, String> {
    return buildMutableMap {
        put(0, "0")
        for (i in 1..10) {
            put(i, "$i")
        }
    }
}

usage()を呼び出すと、Int型のkey/String型のvalueが格納されたMapが返ります。
このMapを生成するのに、builderMutableMap()を用いるのでこの関数を適切に実装していきます。

buildMutableMap()にはput()という関数を渡し(受け取る引数名をbuildとします。)、Int型のkey/String型のvalueが格納されたHashMapを返す必要があるので以下のような実装になります。

String_and_map_builders
fun <Int, String> buildMutableMap(build: HashMap<Int, String>.() -> Unit): Map<Int,String>

HashMap< Int, String>という実装になっているのは、put()を呼び出すのがHashMapインスタンスだからですね。

また、buildMutableMap()の戻り値がMap型になっていますが、もちろんHashMap型でもOKです。

次に、build()を呼び出すためのHashMapインスタンスを生成します。
生成したHashMapインスタンスがbuild()を呼び出し、戻り値として返せばOKです。

したがって、最終的な実装は以下のようになります。

String_and_map_builders
import java.util.HashMap

fun <Int, String> buildMutableMap(build: HashMap<Int, String>.() -> Unit): Map<Int, String> {
    val map = HashMap<Int, String>()
    map.build()
    return map
}

fun usage(): Map<Int, String> {
    return buildMutableMap {
        put(0, "0")
        for (i in 1..10) {
            put(i, "$i")
        }
    }
}

4 最後に

次回はKotlin Koans Builders/The function applyの解説をします:muscle:

G-o
企業でAndroidエンジニアとして働いております。 趣味は筋トレ、お酒を飲むことです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away