Java8で取り入れられたラムダ式について、分かりにくいのでエロい頭で整理してみた。
■最近Java8に触れることが多いです。
ラムダ式、って名前かっこいいですよね。中二心をくすぐられます。
でもオブジェクト志向にしか触れたことのなかった僕にとって、ラムダ式で取り入れようとしている関数型プログラミングの発想って非常に分かりづらいです。
エロい発想で考えてみても「オブジェクト嗜好!」っていわれると、「あぁ、実物触りたいのね」って感じに雰囲気伝わりますが、「関数型!」って言われても「何言ってるの??」ってなっちゃいますよね。
この喩えが「何言ってるの??」かもしれないですが、要するに、関数型って脳内にイメージが沸かずに想像しにくいんです。良くない。
僕なりの理解ですが、
関数型について考えるときに、思考の入り口を「言語仕様」に置くと、混乱してしまう気がします。
正しい入り口は「関数型が流行るに至る問題」に有ります。そこから順を追って関数型プログラミングとはなんぞや、と考えていきましょう。
★物事の真実を掴むに、「そのモノ」から入るのは必ずしも正解ではありません。コンドームを無垢な少年が見ても、ゴム風船にしか見えないように。
「子作りしたい、でも子供作りたくはない」というジレンマを理解した後にコンドームを見た少年が、きっとその用途に気づけるように、背景を理解した後に実物を見れば、自ずと理解は進みます。
■「関数型が流行るに至る問題」とは
Javaが世界で一番使われている言語、とオラクルが言うようにオブジェクト志向が最近まで世を圧巻していました。今も圧巻してます。
エンタープライズ向けの大規模システムを作ろうと思うとき、オブジェクト指向の関心の分離といいますか、他の部分と上手く繋がりやすく作れるところに、強みがあるようです。慣れると楽だしね。
オブジェクト志向のプログラミング言語は世に広まり、関数型の言語はそこまで陽の光を浴びきっていない、そんな状況が生まれていました。
しかし、時の流れとともに、世の中も変わります。
コンピュータ技術はムーアの法則とまでは言わずとも飛躍的に発展を遂げ、昨今では携帯にも高性能のCPUが積まれ、モバイルにエロゲーが出来るようになりました。
そんなある時、人々は気付きました。
「最近CPUやたらデュアルコア、クアッドコアとか言っているけど、CPUの能力、最大限に使っていなくね?」という事実についてです。
CPUのコアがデュアル(2個)、クアッド(4個)になると、単純に捉えると、同時に処理できるタスクがそれだけ倍々になります。
しかし、非関数型のプログラミング言語は、処理を並列で実行するのがちょっと面倒でした。オブジェクト志向(手続き型)のプログラミング言語は、
『比較的自由に、一連の手続きに名前をつけて実行する(メソッド的な)こと』が多いので、その自由さ故に、並列で処理を流すと、他にどう影響をあたえるかが不明確になりやすいことが問題でした。
そんな時に光を浴びたのが関数型プログラミング言語です。関数型は、手続き型の言語に対して、宣言型の言語、とも呼ばれます。詳細に書くと難しくて理解できなくなるのでさっくり書きますが、
・手続き型言語(昔のJavaとか)が、
比較的自由に手続き(命令)を書いて処理を作り、問題を解決する、
のに対して、
・宣言型言語(関数型がそういう傾向)は、
あんま融通聞かない関数を複数個呼び出して問題を解決する、
という風なのです。
あんまり融通が効かない関数、というのはつまり、他に変な影響を与えにくい関数であり、並列で処理を流しやすい、ということに繋がります。
せっかくマルチコアなCPU使ってるんだから、性能良くするためにも並列で処理を流しやすい関数型プログラミングの概念を取り入れようぜ、というのが、Java8におけるラムダ式とStreamAPIの導入なのです。
★難しげな言葉を使うのでよくわからないと思うのですが、
イメージとしては、
・手続き型(オブジェクト指向)はエロゲー、で、
・宣言型(関数型プログラミング)はAV、です。
あなたには抜くという目的があり、そのためにディスプレイが4つ準備されている、という状況を想像してください。
ちょっとむずかしい独特の操作、マウス連打であったり、Ctrlのスキップ、モノによっては戦闘の操作など、が必要なエロゲを4画面同時にやるっていうのはちょっとキツいと思います。どこで手が要るか分からないし、エロいシーンにたどり着くまでの流れがバリエーションありすぎて、並列でエロゲはやはり出来ません。僕には自信がありません(全部Lilithゲーとかない限り)。
でもAVを4画面で並列で見ることは出来ます。やること単純だし、エロにたどり着くために想定外の行動を強いられることはないでしょう。ただ4画面を見ればよいのです。僕には4画面のAVを同時に見る自身はあります。
■ラムダ式について
さて、ここまでは『ラムダ式』というよりも、関数型プログラミングの話になってしまいました。ここからさくっとラムダ式について説明します。
でも、ラムダ式は別に中身としては大したことのない話です。
関数型プログラミングっぽい処理(StreamAPI)がJava8で取り入れられたので、そういう風な関数型っぽい処理を楽に書けるように、
既存と違ったメッチャ省略できる匿名クラスの書き方を新しく作りましょうね〜というのがラムダ式です。
(もちろんラムダ式ができることは他にも有ります。
が、たぶん主目的はStreamAPIです。)
なので、別にただ書き方変わるだけやん!と、心に余裕を持ってラムダ式を見てください。なんか簡単な気がしてきます。
■最後に
最近、Javaのイベントとかに参加しています。そこでよく、Javaのこれからの方向性とは、みたいなことを聞きます。
基本的には、他の言語と同じだとは思うのですが、
・人が楽に書けるような標準化
・高速化のための裏の改良
が主として想定されているようです。
Javaという言語は今も非常に普及していますし、未来もある言語だと思うので、ぜひJava8、勉強してみてください。
今日はエロい話ってか、僕の趣味の話でした。
この記事が気に入ったらサポートをしてみませんか?