LoginSignup
11
4

More than 1 year has passed since last update.

ぼくたちのKotlinにはonEachがある

Posted at

Javaでたまに見る

List<Something> updated = list.stream().map(ele -> {
    ele.setFoo("bar");
    return ele;
}).collect(Collectors.toList());

なるほど、
1. listの各要素のプロパティを更新
2. 変更後の要素そのものを格納したリストを返す
ということがやりたい訳ですね。

...コットリ~~~~~ン!!!!!!!

KotlinにはonEachがある

val updated = list.onEach{ ele -> ele.setFoo("bar") } // { it.setFoo("bar") } でもイケる

Kotlinの世界に来たら1行や!!

onEach は返り値ナシ相当の forEach とは違い、実行後にメソッド呼び出し元のcollectionのインスタンス(の参照)を返してくれます。スゴイ・ステキ

Kotlinにもmapはある

Kotlinの世界にはおなじみの map メソッドもあります。
実行後にlistを返してくれるという点では onEach と同じ…ですが、引数に渡したlambdaの実行結果が集計される(javaのstream.mapと同様)ので、onEachと同じ結果を得るにはやはり迂回が要ります。

// 参考:(kotlin) onEachを使わずに同等の結果を得る
val updated = list.apply{ map{ ele -> ele.setFoo("bar") } }
// ...または
val updated = list.apply{ forEach{ ele -> ele.setFoo("bar") } }

javaよりはスマートに書けますが、onEachがある以上この例のような書きどころはまず無さそうです。
apply はあらゆる変数に付加できるKotlin特有の関数です。引数に渡したlambda(例でいう {} 内のロジック)の実行後、もともとの変数と同じ参照を返します。

※上記のforEachを使った例では、IDEにIntelliJを利用なら”onEachを使え”と怒られます(mapを使うとスルーなのは謎)

Kotlinは爽快

Kotlinは学習中の身ですが、痒い所に手が届く構文・APIが数多く用意されていて 『書いていて楽しい』 です。私が元々Javaのコード書きだったせいか、ひとつひとつの言語仕様にすごく、納得感に似た心地よさを覚えます。
Google提供のしっかりしたBootcampもあるので、ちょっと触ってみたいかも…という方は是非。

11
4
2

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
11
4