この第33章では、プログラミング言語であるKotlinのmaxByとminByやメンバ参照について、一緒に勉強していきましょう。
この記事を読めばプログラミング未経験の方も、KotlinのmaxByとminByやメンバ参照について1つ1つ理解しながら勉強できると思うので、是非最後まで読んで頂ければと思います。
※この記事で出てくる「サンプルコード」は、記述が長く画面からはみ出ている場合がありますが、横にスライドすると表示されるのでご安心ください。
こんにちは!リンコですピヨ!この記事では自分の勉強の復習もかねて、KotlinでのmaxByとminByやメンバ参照を記述する方法を解説するピヨ!
前章では、コレクションに標準で備わっている機能の「forEach」や「filter」というものを勉強していきました。
この章では、この2つと同じでコレクションに備わっている機能の「maxByとminBy」や、メンバ参照について勉強していこうと思います。
【Kotlin】maxByとminByとは?
まずはmaxByとminByがどういうものなのか、一緒に勉強していきましょう。
配列やコレクションで使える
maxByとminByは、forEachやfilterと同じで配列やコレクションで使える便利な機能です。
またラムダ式の際に使うのに非常に相性が良いので、この先使うことが多いと思います。必ず覚えるようにしましょう。
最大値と最小値を取得する
maxByとminByは、最大値と最小値を取得する機能になります。
正確にはラムダ式が返した値で大小を比較しmaxByで最大値、minByで最小値を取得してくれます。
maxByとminByを使うと、ラムダ式が返した値で最大値と最小値を取得することができるピヨ!
【Kotlin】maxByとminByを記述してみよう
maxByとminByに関してなんとなく理解したところで、実際に記述していきましょう。
サンプルコード
以下のサンプルコードでは、配列に長さが違う文字列を5つ代入しています。
fun main() { val array = arrayOf("あああ", "いい", "う", "えええええ", "おおおお") val max = array.maxBy{it.length} println("配列の中で一番文字列の長さがあるのは「${max}」です。") val min = array.minBy{it.length} println("配列の中で一番文字列の長さがないのは「${min}」です。") }
出力
サンプルコードを実行すると、以下のように出力されます。
配列の中で一番文字列の長さがあるのは「えええええ」です。 配列の中で一番文字列の長さがないのは「う」です。
このコードではまず、配列arrayに長さの違う5つの文字列を代入しています。
val array = arrayOf("あああ", "いい", "う", "えええええ", "おおおお")
その後、maxByとラムダ式を使って配列の中身の文字列の長さを比較して、最大値を関数オブジェクトmaxに格納しています。。ここの「length」は文字列の長さを計算するものでしたね。
val max = array.maxBy{it.length}
最後に、printlnで最大値を出力しています。
println("配列の中で一番文字列の長さがあるのは「${max}」です。")
最小値を表す「minBy」でも同様のことを行っています。
このように、ラムダ式とmaxByとminByを組み合わせることで、最大値と最小値を取得することができます。
maxByやminByは今後も使うのでしっかり覚えておくピヨ!
【Kotlin】メンバ参照とは?
では続いて、メンバ参照について勉強していきましょう。
ラムダ式の記述を簡潔にできる
メンバ参照は、maxByやminByを使った際のラムダ式の記述を、今までよりもさらに簡潔にできるものです。
クラスの持つ値を返したい時に使える
単に配列やコレクションに対してmaxByやminByを使う時は上記で勉強したように記述しますが、メンバ参照は、とあるクラスのインスタンスの持つ値を返したい時に使えるものです。
メンバ参照は、クラスのインスタンスが持つ値を返す記述を簡潔にするピヨ!
【Kotlin】メンバ参照を記述してみよう
メンバ参照についてなんとなく理解したところで、実際に使っていきましょう。
サンプルコード
以下のサンプルコードでは、Snackというお菓子のクラスを作り3つのお菓子の内、一番値段の高いお菓子を出力するようにしています。
fun main() { val getPrice = Snack::price //ここがメンバ参照 val snack1 = Snack("ポテチ", 150) val snack2 = Snack("チョコ", 100) val snack3 = Snack("お煎餅", 80) val snacks = listOf(snack1, snack2, snack3) val maxPriceSnacks = snacks.maxBy(getPrice) println("一番高いお菓子は何?") maxPriceSnacks?.value() } class Snack(val snackName: String, val price: Int) { fun value(){ println("${snackName}、${price}円です。") } }
出力
サンプルコードを実行すると、以下のように出力されます。
一番高いお菓子は何? ポテチ、150円です。
このコードでは、まず先程のように関数のパラメータとしてラムダ式を引き渡すのではなく、関数オブジェクトとしてメンバ参照したラムダ式を代入しています。
メンバ参照していないラムダ式のコードも載せておきますので、どれくらい違うのかも見比べてみてください。
val getPrice = Snack::price //メンバ参照している val getPrice = ({s: Snack -> s.price}) //メンバ参照していない
次の4行では、Snackクラスから3つのインスタンスを生成して、パラメータとしてお菓子の名前と値段を引き渡すようにしています。
そして4行目でこの3つのインスタンスを、リストSnacksに代入しています。
val snack1 = Snack("ポテチ", 150) val snack2 = Snack("チョコ", 100) val snack3 = Snack("お煎餅", 80) val snacks = listOf(snack1, snack2, snack3)
最後に、リストsnacksに対してmaxByを使用しています。
この時にメンバ参照したラムダ式の代入されているgetPriceをパラメータとして受け取っているので、3つのインスタンスの値段を比べて一番高いお菓子のインスタンスがmaxPriceSnacksに代入されています。
そして、一番高いお菓子のインスタンスが入ったmaxPriceSnacksのvalue関数が呼び出され、結果が出力されました。
※?.がついているのは25章で勉強したセーフコール演算子ですね
val maxPriceSnacks = snacks.maxBy(getPrice) println("一番高いお菓子は何?") maxPriceSnacks?.value()
最初は少しややこしく感じるかもしれませんが、覚えるとこのように簡潔にコードを記述することができるので、繰り返し勉強して必ず覚えるようにしましょう。
「({s: Snack -> s.price})」と言う記述が、メンバ参照を使うことで「Snack::price」とかなり簡潔になったピヨ!
まとめ
この記事では、プログラミング言語であるKotlinのmaxByとメンバ参照について勉強していきましたが、いかがでしたでしょうか?今回の記事をまとめると以下のようになります。
- maxByでラムダ式が返した値の最大値を、minByで最小値を取得できる
- メンバ参照は「あるクラスのインスタンスの持つ値を返す」関数を簡潔に表せる
今回勉強した「maxBy」や「メンバ参照」は難しくややこしいと思うので、何回も読み直してしっかり覚えておきましょう。
次回の記事では「クロージャ」について勉強していくピヨ!
プログラミング未経験の方や入門レベルの方、Kotlinについて詳しくなりたい方は、また一緒に勉強するピヨ!
コメント