#Javaでたまに見る
List<Something> updated = list.stream().map(ele -> {
ele.setFoo("bar");
return ele;
}).collect(Collectors.toList());
なるほど、
- listの各要素のプロパティを更新
-
変更後の要素そのものを格納したリストを返す
ということがやりたい訳ですね。
...コットリ~~~~~ン!!!!!!!
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もあるので、ちょっと触ってみたいかも…という方は是非。