LoginSignup
2
1

More than 1 year has passed since last update.

Kotlin 基礎 -- スコープ関数での処理ブロックの追加

Last updated at Posted at 2022-11-04

why

ブロック処理は Kotlin の基礎であり、必須だと気づいたから


参考

Kotlin サーバーサイドプログラミング実践開発

Page 100 of 495


5 つのスコープ関数

with
run
let
apply
also

これらの 5 つのスコープ関数が有る。

これは関数やインスタンスに追加したり、引数として取ることで拡張できる。


let

一番シンプル。関数に追加すると、その関数の結果を it として扱えるブロックを作成できる。

	fun get1(): Int{
		return 1
	}
	val letTest = get1().let { it + 1 }
	println(letTest)

2

ここでは 1 を返す関数に let をつけたので
it が 1 として扱われ、1 + 1 で 2 が返ってくる。

前の記事に書いたように、?.let を使うことで null ではない場合のみ実行できる。これによって nullable な値もぬるぽの心配なく安全に扱える。


run

run では it ではなく this で元の関数の返り値が扱える。

	fun get1(): Int{
		return 1
	}
	get1().run { println(this+1)}

2

	fun get1OrNull(): Int?{
		return null
	}
	get1OrNull()?.run { println(this+1) }

こちらも Null 安全な実行ができる。


with

	fun get1(): Int{
		return 1
	}
	val withTest = with(get1()) { this + 1 }
	println(withTest)

2

with は引数で関数の結果をレシーバーとして受け取る。
そして次のブロックで this として扱い処理し、返り値とする。

どうみても run の方が使いやすい。


apply

	fun get1(): Int{
		return 1
	}
	val applyTest = get1().apply { this + 1 }
	println(applyTest)

1

apply はブロックの結果を返さない。
let や with とはそこが違う。

apply を当てた関数が返って来ている。

	data class Dog(var name: String)
	val pochi = Dog("Pochi")
	val applyTest = pochi.apply { this.name = "Hachi" }
	println(applyTest)

Dog(name=Hachi)

name = Pochi として作成した Dog のインスタンスを
apply を使って this.name にアクセスして
name = Hachi に変更することができた。


also

	data class Dog(var name: String, var age: Int)
	val pochi = Dog("D",3)
	val alsoTest = pochi.also { it.name = "E" } .also { it.age = 10 }
	println(alsoTest)

Dog(name=E, age=10)

also も apply と同じく本体を返す。
apply と違っていくつでもつなげていくことができる。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1