JavaからKotlinに移行したAndroidエンジニアが困った!!スコープ関数について解説してみる
皆さんこんにちは。
GOATの平社員じゅんじゅんです。
このご時世でソーシャルディスタンスができるということもあり
最近ゴルフをはじめまして。。。
スコアも好調に伸びており頑張っております!!
ということで今回は、Kotlinの「スコープ関数」について解説してみたいと思います。
今回の目的
私は遅ればせながら、2020年末ごろからKotlinでの開発に携わらせていただいています。
それまで5年ほどは、AndroidJavaの開発を行っておりました。
そこで、Kotlinのソースコードを確認したところ、以下のような書き方が目に入りました。
val i : Int = 1
val s : String = i.let { it.toString() }
初見では、「うわぁ・・・Kotlinっぽい!」程度にしか思えませんでしたので
AndroidJavaからKotlinへ移行された方向けに、わかりやすくご説明できたらと思います。
※注意※ 以下の内容には、個人の主観が含まれます
スコープ関数とは
Kotlinで使用できるジェネリック関数の一つとなっておりまして
あらゆる型にも対応できる関数となっています。
詳細は、以下の公式ドキュメントを!
https://kotlinlang.org/docs/scope-functions.html
スコープ関数の種類
スコープ関数には、以下の5種類があります。
関数 | 呼び出し元参照 | 戻り値 |
let | it | ラムダの結果 |
run | this | ラムダの結果 |
with | this | ラムダの結果 |
apply | this | コンテキスト |
also | it | コンテキスト |
Kotlinを実装し始めた体感ですが、letが一番使っている気がします。
上記表の中でも今回は、「let」に焦点を置いて説明したいと思います。
letの基本形
基本形としては、以下の様になります。
val i = 変数.let { 処理の内容 }
「変数」に対して、なんだかんだ処理を施してあげたい場合に
「処理の内容」部分に記載すると
「i」に対して、「変数」を処理したものが入れられます。
セーフコールの使用も可能
val s : String? = null
s?.let { println(Log.d("Tag", s)) }
上記のようにセーフコール実装も可能です。
文字列定義の”s”には、nullが設定してあります。
この場合、文字列”s”がnullの為、let関数の中身は実行されません。
nullチェックが必要な場合にも柔軟に使用することが可能です。
簡単な処理でJavaと比較してみる
Listの中身をLogcatへ出力してみたいと思います。
まずはJava。
List<String> testList = new ArrayList<String>();
testList.add("Baseball");
testList.add("Soccer");
testList.add("Golf");
for(int i = 0; i < testList.size(); i++) {
if(testList.get(i) != null){
Log.d("Test Log", "testList[" + testList.get(i) +"]");
}
}
JavaのList出力処理です。
皆さんAndroidにJava手を付け始めた方はよく見たコードだと思います。
続いて、Kotlinでletを使用して同じ処理ができるようにします。
val testList = mutableListOf<String?>("Baseball", "Soccer", "Golf")
testList.let {
for(item in it) Log.d("Test Log", "testList[$item]")
}
これだけ・・・・
すっきりとして見やすいかと思います。
(Listの宣言方法が異なるので何とも言えませんが・・・)
最後に
上記のようなJavaとKotlinの書き方の違い、他にも様々あると思います。
Collectionなんかについても、お話していきたいですね!
JavaからKotlinに乗り換えた方。。。
頑張っていきましょう!!私も必至で時代についていきます。
以上!