[解決済み] Kotlinでrun、let、apply、also、withを使うべき例
質問
run, let, apply, also, with の各関数について、良い例があればと思います。
私は、以下の本を読みました。 この記事 しかし、まだ例がない
どのように解決するのですか?
これらの関数はすべて、現在の関数/変数のスコープを切り替えるために使用されます。これらは、一緒になっているものを一箇所にまとめておくために使われます(主に初期化)。
以下はその例です。
run
- は欲しいものを何でも返し、この変数が使われている場所を
this
val password: Password = PasswordGenerator().run {
seed = "someString"
hash = {s -> someHash(s)}
hashRepetitions = 1000
generate()
}
パスワードジェネレータは、現在
this
を設定することができます。
seed
,
hash
と
hashRepetitions
を変数を使用せずに使用することができます。
generate()
のインスタンスを返します。
Password
.
apply
も同様ですが、これは
this
:
val generator = PasswordGenerator().apply {
seed = "someString"
hash = {s -> someHash(s)}
hashRepetitions = 1000
}
val pasword = generator.generate()
これは特にBuilderパターンの代わりとして、また特定の設定を再利用したい場合に有効です。
let
- 主にNULLチェックを回避するために使用されますが、以下のような代替としても使用できます。
run
. 違いは
this
は以前と同じで、再スコープされた変数にアクセスするには
it
:
val fruitBasket = ...
apple?.let {
println("adding a ${it.color} apple!")
fruitBasket.add(it)
}
上記のコードでは、リンゴがNULLでない場合にのみバスケットに追加されます。また
it
が
はもうオプションではありません。
そのため、ここで NullPointerException に遭遇することはありません。
?.
の属性にアクセスすることができます)。
also
- を使いたいときに使います。
apply
をシャドーイングする必要はない。
this
class FruitBasket {
private var weight = 0
fun addFrom(appleTree: AppleTree) {
val apple = appleTree.pick().also { apple ->
this.weight += apple.weight
add(apple)
}
...
}
...
fun add(fruit: Fruit) = ...
}
使用方法
apply
ここで、シャドウ
this
で、そのため
this.weight
はリンゴを指すことになり
ではなく
はフルーツバスケットを意味します。
注:恥ずかしながら例題をパクりました 私のブログから
関連
-
[解決済み] Kotlinのメンバー宣言に期待する
-
[解決済み] lateinit "変数が初期化されたかどうかを確認する方法は?
-
[解決済み] by lazy" と "lateinit" を使ったプロパティの初期化
-
[解決済み] Kotlinのvarとvalの違いは何ですか?
-
[解決済み】Kotlin : パブリック get プライベート set var
-
[解決済み] Kotlinでログを取るための慣用的な方法
-
[解決済み] if式でのBoolean?の使用
-
[解決済み] Kotlinでリソースからテキストファイルを読み込むには?
-
[解決済み] MutableLiveData。コルーチンからバックグラウンドスレッドでsetValueを実行できない
-
[解決済み] KotlinのArrayList<String>()とmutableListOf<String>()の相違点
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Kotlinのメンバー宣言に期待する
-
[解決済み] Kotlinの'let'キーワードの目的は何ですか [重複]。
-
[解決済み】「不適切なブロッキングメソッドの呼び出し」を適切にする方法は?
-
[解決済み] KotlinでStringをLongに変換する方法は?
-
[解決済み] Kotlin の単一感嘆符
-
[解決済み] なぜKotlinではJavaの静的フィールドの代わりのようなものとして「コンパニオンオブジェクト」を使うのか?
-
[解決済み] if式でのBoolean?の使用
-
[解決済み] Kotlinで'by'キーワードは何をするのですか?
-
[解決済み] Kotlinでrun、let、apply、also、withを使うべき例
-
[解決済み] Kotlinでリソースからテキストファイルを読み込むには?