SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

【最新Kotlinアップデート解説】バージョン1.1からの変更点総まとめ

Kotlin最新アップデートまとめ ──関数の変更点を紹介、引数の渡し方・引数のデフォルト値

【最新Kotlinアップデート解説】バージョン1.1からの変更点総まとめ 第2回

  • X ポスト
  • このエントリーをはてなブックマークに追加

既存関数を渡す仕組みがより柔軟に

 関数型引数に対して、既存関数を::によって渡す仕組みが、バージョン1.4でより柔軟になりました。本節では、その変更点4個をまとめて紹介します。

デフォルト値を含む関数

 まず、関数型引数のシグネチャが引数なしの場合、デフォルト値とともに引数が定義された関数を渡せるようになりました。つまり、シグネチャの引数定義の不一致でもデフォルト値があれば問題なく動作するということです。

 例えば、リスト14の(1)の関数execNoParamProcessor()があるとします。この関数の引数であるprocessorには、引数がありません。

[リスト14]引数のない関数型引数と引数がある関数の組合せ例
fun execNoParamProcessor(processor: () -> Int) {  // (1)
  val ans = processor()
  println("計算結果: ${ans}")
}
fun multiply2NumWithDefault(num1: Int = 2, num2: Int = 3): Int {  // (2)
  return num1 * num2
}

 このexecNoParamProcessor()を実行する際に、次のように、リスト14の(2)の関数multiply2NumWithDefault()を渡せます。

execNoParamProcessor(::multiply2NumWithDefault)

戻り値がある関数

 次は戻り値の不一致です。関数型引数のシグネチャが戻り値なし、すなわち、Unit型の場合、戻り値がある関数を渡しても問題なく動作するようになりました。

 例えば、リスト15の(1)の関数execUnitProcessor()があるとします。この関数の引数であるprocessorは戻り値のない、すなわち、戻り値がUnit型の関数です。

[リスト15]戻り値のない関数型引数と戻り値がある関数の組合せの例
fun execUnitProcessor(processor: (num1: Int, num2: Int) -> Unit) {  // (1)
  processor(5, 6)
}
fun multiply2Num(num1: Int, num2: Int): Int {  // (2)
  val ans = num1 * num2
  println("計算結果: ${ans}")
  return ans
}

 このexecUnitProcessor()を実行する際に、次のように、リスト15の(2)のmultiply2Num()関数を渡しても問題なく動作します。

execUnitProcessor(::multiply2Num)

可変長引数の関数

 次に、関数型引数のシグネチャとして、データ型が同じで引数の個数が違うだけの場合、可変長引数の関数を渡せるようになりました。

 例えば、リスト16の(1)~(3)の引数processorのシグネチャは、第2引数以降のInt型引数の個数が違うだけの構造となっています。

[リスト16]processorの第2引数以降の個数が違う関数と可変長引数の関数の組合せ例
fun doNoIntArgs(processName: String, processor: (className: String) -> Unit) {  // (1)
  println("${processName}を実行します。")
  processor("い")
}
fun doOneIntArgs(processName: String, processor: (className: String, score: Int) -> Unit) {  // (2)
  println("${processName}を実行します。")
  processor("ろ", 4)
}
fun doTwoIntArgs(processName: String, processor: (className: String, score1: Int, score2: Int) -> Unit) {  // (3)
  println("${processName}を実行します。")
  processor("め", 4, 8)
}
fun showClassScore(className: String, vararg scores: Int) {  // (4)
  println("${className}組の合計は${scores.sum()}点です。")
}

 これらの関数を実行する際、リスト16の(4)の可変長引数(vararg引数)の関数showClassScore()を用意して、次のように引数processorとして渡せるようになりました。

doNoIntArgs("doNoIntArgs", ::showClassScore)
doOneIntArgs("doOneIntArgs", ::showClassScore)
doTwoIntArgs("doTwoIntArgs", ::showClassScore)

suspend関数型引数

 最後に紹介するのが、関数型引数がsuspend関数の場合です。例えば、リスト17の(1)のような関数execIntArraySuspendProcessor()があるとします。

[リスト17]関数型引数processorがsuspend関数の例
fun execIntArraySuspendProcessor(processor: suspend (array: IntArray) -> Int) {  // (1)
  :
}
fun multiplyArray(array: IntArray): Int {  // (2)
  :
}

 このexecIntArraySuspendProcessor()に引数として渡す関数として、リスト17の(2)のように、suspendではない関数multiplyArray()を想定します。この場合でも、次のように、execIntArraySuspendProcessor()の引数として指定することが可能になりました。

execIntArraySuspendProcessor(::multiplyArray)

suspend関数型引数へのsuspendでない関数の適用の拡充

 関数型引数に渡せる関数のバリエーションに関して、バージョン1.4での拡張は以上の4点ですが、前項で紹介したsuspend関数型引数にsuspendではない関数を渡すパターンが、バージョン1.6でさらに拡充されました。まず、リスト18のように、suspendではないラムダ式も記述できるようになりました。

[リスト18]suspendではないラムダ式を引数とした例
execIntArraySuspendProcessor {
  :
}

 また、リスト19のように、suspendではない無名関数を代入した変数を引数として渡すことも可能になりました。

[リスト19]suspendではない無名関数を引数とした例
val processor = fun(array: IntArray): Int {
  :
}
execIntArraySuspendProcessor(processor)

次のページ
インライン関数における関数型引数のデフォルト値

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
【最新Kotlinアップデート解説】バージョン1.1からの変更点総まとめ連載記事一覧
この記事の著者

WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。Web系製作会社のシステム部門、SI会社を経てフリーランスとして独立。屋号はSarva(サルヴァ)。HAL大阪の非常勤講師を兼務。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/20990 2025/02/25 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング