この記事は下記キャンペーンに参加し、シュガー・ラッシュ・オンラインの感想を書いています。
内容のネタバレを含みますので、視聴後の閲覧を推奨します。
映画「シュガー・ラッシュ:オンライン」の感想 #シュガラお題 blog.hatena.ne.jp
続きを読むこの記事は下記キャンペーンに参加し、シュガー・ラッシュ・オンラインの感想を書いています。
内容のネタバレを含みますので、視聴後の閲覧を推奨します。
映画「シュガー・ラッシュ:オンライン」の感想 #シュガラお題 blog.hatena.ne.jp
続きを読むKotlinにおけるコレクション遅延操作の仕組み。
Java8で導入されたStreamに似ており、各要素を直列に評価したあと、最終的な結果を取得する。
こう書くと難しそうなので、実際のコードを見てもらったほうが早いと思います。
(1..3).map { it * 10 } .map { it * 10 } .map { it * 10 }
このような処理の場合、通常のCollectionのまま操作を行うと、map毎にループが発生し、Listを生成します。
実際に行われている処理は下記のような感じで、ループ回数は9回、Listは4つ生成されているのがわかりますね。
val list = mutableListOf(1, 2, 3) val list2 = list.map { it * 10 } val list3 = list2.map { it * 10 } val list4 = list3.map { it * 10 }
Sequenceを使った場合は、このように書きます。
(1..3).asSequence() .map { it * 10 } .map { it * 10 } .map { it * 10 } .toList()
見た目はほぼ変わらないのですが、実際に行われる処理は全く異なります。
val list = mutableListOf(1, 2, 3) val list2 = list.map { val result1 = it * 10 val result2 = result1 * 10 result2 * 10 } println(list2)
生成されるListは2つ、ループ回数は3回と、大幅に計算量が減っています。
ループ回数よりもこちらのほうが、計算量に大きな差が出ます。
(1..3).map { it * 10 } .map { it * 10 } .map { it * 10 } .first{ it == 2000 }
このような処理の場合、first()
の手前まですべての要素を処理してから結果を生成します。
実際に行われている処理は下記のような感じで、先述した計算に加えて、
first()
で2000に行き当たるまでの2回計算回数が増えています。
また、Listも一つ多く生成されて5個になっていますね。
val list = mutableListOf(1, 2, 3) val list2 = list.map { it * 10 } val list3 = list2.map { it * 10 } val list4 = list3.map { it * 10 } val list5 = list4.first{ it == 2000 }
Sequenceを使った場合は、このように書きます。
(1..3).asSequence() .map { it * 10 } .map { it * 10 } .map { it * 10 } .first{ it == 2000 }
こちらも見た目はほぼ変わらないのですが、実際に行われる処理は全く異なります。
val list = mutableListOf(1, 2, 3) val list2 = list.first { val result1 = it * 10 val result2 = result1 * 10 val result3 = result2 * 10 result3 == 2000 } println(list2)
生成されるListが2つなのは前回と同じですが、この場合なんとループ回数が2回で終わります。
要素をひとつずつ処理するので、 first()
や take()
などのように、
全ての要素を処理する必要がないケースで絶大な効果を発揮するのです。
asSequence()
で Sequence
として扱うと良いよKotlinってかわいいですよね。
サーバーサイド開発者の皆さん、Android開発者がうれしそうにKotlinの話をしているときに、
嫉妬したことはありませんか? 私はあります
今年1月に転職してから、色々と新しい事をやらせてもらえる環境になったので、
思いつきでKotlin入れませんか?と言ってみたところ上長から快諾され、導入できました。
そんなこんなで2018年後半はずっとSever Side Kotlinを書いていた感じでした。
Android界隈でさんざん語られ尽くしている話題なので今更感もあるのですが、一応。
Kotlin導入以前のシステムは、主にJava8+Lombokでできていました。
なので、実は環境的に不満はあまりなかったんですね。
でも、Lombokのアノテーションとか毎回書くのめんどくさいじゃないですか、とか。
あとは込み入った処理になるとどうしても記述が多くなって読みづらくなってしまう、
Javaを使っている故の制約を感じるとか。
そういう細かい部分で気になることが多くて解決策を探していたところ、
Better Java(この言葉最近良く見ますね)としてKotlinを挙げる記事を多く見かけました。
特に気になったのはこの辺の仕様です。
タイミング的にも、エムスリーさんが導入事例を広く公開しだした時期だったため、
話題性で上司にプッシュしやすかったという理由もあります。
エムスリーで「サーバサイドKotlin」を導入したチームに話を聞きました - エムスリーテックブログ
元々Java + Jersey2で稼働しているシステムがあったので、
イチから作り直すという選択肢はありませんでした。
折よく新規API開発の案件が降ってきたので、ものは試しと新規API部分のみKotlinで書くことに決定。
私は下記の連載を読みながらとりあえず書いてみるという形で進めました。おすすめです。
一週間程度書いていれば手に馴染んでしまうのではないでしょうか。
毎日Kotlin | シリーズ | DevelopersIO
mavenの記述にKotlinへの依存を追加しそのままktファイルを作成してみたところ、
いくつか困る部分はあったものの割とすんなり導入に成功。
懸念していたJavaとの接続部分も特に問題なし。優秀です。
困った部分で一番大きかったのが下記記事に書いた件です。
アノテーションの対象を明示的に書いてやらないとうまく作用しないというのがわからず、
無限に時を溶かしました。
【Kotlin】KotlinでJava EEのBean Validationを使うときの注意点 - B-Teck!
もう一個かなり困ったのが、EclipseだとKotlinのplugin入れてもかなり厳しいということです。
Kotlin導入するなら素直にIntelliJ IDEA買いましょう。。。
導入成功に気を良くして、もりもりKotlinを増やしていたら新しいプロジェクトが始まったので、
実績を盾に開始時から基本的にすべてKotlinで書いています。
どうしてもKotlinに書き換えるとうまく動作せずJavaで書いた箇所はありますが、
概ね95%程はKotlinで書かれています。
最近では流行に乗ってCoroutinesも入れてみたりしました。
既存Javaプロジェクトへの部分的な導入も簡単!
既存ライブラリとの相互運用性もバッチリ!
簡潔でモダンな記述でイケイケエンジニアになれる!
事例が増えてきて、情報少ない問題も解決しつつある!
Server Side Kotlinは怖くない!みんなもやろう!!