滅入るんるん

何か書きます

Kotlinを学ぶにはC#を勉強したほうがいい(SequenceとLINQ)

タイトル半分ぐらい釣りです(半分大真面目)

最初に断っておきますが、Kotlinを勉強するのに必ずしもC#を勉強したほうがいいわけではありません、もちろんVB.NETでも概念は学べますし代替手段はいくらでもあると思います。

そこで、なぜC#を勉強したほうがというと単純に知見の数やKotlinはC#を意識しているとかいろいろありますが、自分がC#を推しているからです。

Sequence

ところで、Kotlin使いの皆さんは本題のSequenceについてご存知でしょうか?
知らない方も多いかと思います。自分も1年ぐらい知りませんでした。
 
簡単に説明すると遅延実行するリスト操作関数です(Sequence自体はインターフェースです)。
 
遅延実行とはなんぞやって方はそのまま「C# LINQ 遅延評価」などでググってどうぞ。
 
そこで、「なぜSequenceがあるのか?Sequenceを使うと何が美味しいの?」というと単純に説明すると省メモリにできます(ツッコミどころのある説明だけどマサカリは飛ばさないで)。
このあたりの利点は「C# LINQ」などでググったらちらほらと見れるはずです。
 
「じゃあ、それなりに利点あるし使いたい!けど、わからない、どうやって勉強したらいいの?」
ってなりますよね?
そこでC#のLINQ(正確にはLINQ to Objects)ですよ。

LINQ

LINQというと.NETが提供する機能ですが、ほとんどの場合C#で用いているものを指していると思います。
そんなLINQですがWikipediaによるとVisual Studio 2008から対応しているらしいので、単純計算で10年近くの歴史があることになります。
Kotlinより歴史ありますよね?そういうわけで、今のところ知見的には同じような概念なので、KotlinのSequenceを学ぶならC#のLINQを学べばいいということになります。
 
ただし、KotlinのSequenceを学ぶためという用途ならば、学ぶのはLINQ to Objectsだけで十分かと思います。LINQは他にもLINQ to SQLなどがあります。

Reactive Extensions(Rx)

LINQの話をするとこちらにも飛んできちゃいます、そうReactive Extensionsです。
他言語界隈の人ならRxのほうが身近な単語かと思います。実は元祖RxがReactive Extensions(Rx.NET)です。
RxのことをReactive Extensionsという人はだいたいC#erというのが持論であったりします(笑)
 
はい、そこでLINQとの関連性ですが、LINQは要素がStreamに流れてくるイメージ、Reactive Extensionsはイベント(時系列データ)がStreamに流れてくるイメージの品物だったりします。
Reactive Extensions自体の説明はググって見てください。だいたいLINQと絡めて上記のような説明になってると思います。
 
このようなことから他のRx(特にRxJava)と違ってLINQのような前段階の概念を踏まえて説明ができたりするのです。そのため、LINQやSequenceを理解してからReactiveな世界に入れば理解力が高いのではないかと自分は思ってたりします。
(※いちおうJavaにもLINQをパクったStreamがありますが、RxJavaが魔改造されてStreamだけでは説明しきれないありさまになっている)
 

余談

RxはもちろんKotlinにもあります(主実装はRxJavaですが)。
そのためRxからはなかなか逃れられない運命かと思いますが、みなさん、Rx(特にRxJava)で非同期処理ゴリ押しするの嫌じゃないですか?少なくとも自分は嫌です。
 
幸いにも、Kotlinでは非同期処理にコルーチンを使うこともできます。
コルーチンについて調べてみたらasync/awaitという単語に出会いませんか?
そう、あれはC#(.NET)発祥なのです。そのためコルーチンを学ぶには(以下略)
というわけで、みなさんKotlinを学ぶにはC#を学んだ方がいいという話でした!!
(C#学んだらそのままC#の沼に溺れてC#の世界に浸れよ……って感じですが)