golf_laser_scope_man

JavaからKotlinに移行したAndroidエンジニアが困った!!スコープ関数について解説してみる

#Kotlin
written by じゅんじゅん

皆さんこんにちは。
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に乗り換えた方。。。
頑張っていきましょう!!私も必至で時代についていきます。

以上!