SHOEISHA iD

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

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

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

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

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

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

関数型引数の渡し方

 Kotlinの関数は、その引数に関数を受け取ることが可能です。このような関数を、高階関数Higher-Order Functions)といい、関数である引数を、関数型Function Types)引数といいます。

関数型引数定義

 例えば、前回の記事のリスト9で紹介したMutableMapオブジェクトであるfruitListのforEach()メソッドは、その引数として関数を受け取るようになっており、その定義は、リスト6のようになっています。引数であるactionの型として定義されている「(Map.Entry<K, V>) -> Unit」が関数型を表し、()内が引数の型、->の先が戻り値の型を表します。結果、actionは、Map.Entry<K, V>型の引数を1個受け取り、戻り値がない関数、ということになります。

[リスト6]MutableMap#forEach()の引数定義
forEach(action: (Map.Entry<K, V>) -> Unit)

ラムダ式の引数の分割宣言

 このforEach()の引数として前回の記事のリスト9で紹介したコードは、ラムダ式であり、本来ならば引数をひとつ定義し、リスト7のコードとなるはずです。(1)でMap.Entry<K, V>型の引数elementを定義し、(2)でそのプロパティのkeyとvalueを利用しています。

[リスト7]forEach()の引数ラムダ式の本来の引数定義
fruitList.forEach {
  element ->  // (1)
  println("${element.key}のフルーツは${element.value}です")  // (2)
}

 これが、バージョン1.1から分割宣言を利用できるようになり、前回の記事のリスト9のようなコードが可能になりました。

無名関数

 ところで、リスト7のラムダ式のように、関数型引数に渡す値として、関数定義を直接記述するものを、関数リテラルFunction Literals)と言います。関数リテラルには、ラムダ式の他に、無名関数があります。

 例えば、リスト8のような関数定義があるとします。この関数execIntArrayProcessor()の引数は関数型となっており、整数配列を引数として何らかの計算を行い、整数をリターンするものです。

[リスト8]関数型引数を持つ関数の例
fun execIntArrayProcessor(processor: (array: IntArray) -> Int) {
  val array = intArrayOf(3, 5, 7, 9)
  val ans = processor(array)
  println("計算結果: ${ans}")
}

 このexecIntArrayProcessor()の引数にラムダ式を渡すこともできます。一方、無名関数を渡すとなると、リスト9のコードの通りになります。

[リスト9]execIntArrayProcessor()に無名関数を引数として渡すコード例
execIntArrayProcessor(fun(array: IntArray): Int {
  return array.sum()
})

既存の関数を渡す方法

 さらに、リテラルではなく、既存の関数を渡すこともできます。例えば、リスト10の関数sumArray()があるとします。

[リスト10]数値配列を引数とする関数の例
fun sumArray(array: IntArray): Int {
  return array.sum()
}

 このsumArray()の関数シグネチャは、リスト8のexecIntArrayProcessor()の関数型引数processorのシグネチャと一致します。ということは、この関数を引数として指定することが可能であり、その場合は、リスト11のように、::関数名を引数として渡します。

[リスト11]関数型引数に関数名を指定するコード例
execIntArrayProcessor(::sumArray)

メソッドを渡す方法

 この::を利用して関数型引数に値を渡せるものとして、オブジェクトのメソッドを渡せるように、バージョン1.1で変更になりました。

 例えば、リスト12のクラスArrayProcessorがあるとします。メソッドsubtractArray()のシグネチャは、リスト10のsumArray()関数同様に、execIntArrayProcessor()の関数型引数processorのシグネチャと一致します。

[リスト12]数値配列を引数とするメソッドを含むクラスの例
class ArrayProcessor {
  fun subtractArray(array: IntArray): Int {  // (1)
    :
  }
  fun executeArrayProcessorBySubtract() {
    execIntArrayProcessor(::subtractArray)  // (2)
  }
}

 このArrayProcessorクラスのメソッドを引数としてexecIntArrayProcessor()を実行する場合は、リスト13のコードのように、クラスインスタンスの変数名::メソッド名を引数として渡します。

[リスト13]関数型引数にメソッド名を指定するコード例
val arrayProcessor = ArrayProcessor()
execIntArrayProcessor(arrayProcessor::subtractArray)

クラス内でのthisは不要に

 では、subtractArray()を、同じクラス内から関数型引数として渡す場合はどのようになるかのコード例が、リスト12の(2)です。これは、本来、変数名::メソッド名の変数名部分をthisと記述し、次のコードとしていました。このthisの記述が、バージョン1.2で不要となり、(2)のようにメソッド名の指定だけで済むようになりました。

execIntArrayProcessor(this::subtractArray)

次のページ
既存関数を渡す仕組みがより柔軟に

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

  • 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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング