【復習】Java女子部でやった、ラムダ式ハンズオン(2):ラムダ式が追加された理由。
Java女子部でやった↓の復習 その2
【東京】◆Java SE 8勉強会◆女子部もラムダ式に挑戦! - Java女子部 | Doorkeeper
実際にやった内容は、講師の櫻庭さんの記事↓を見てください。
Java in the Box Annex: ◆Java SE 8勉強会◆女子部もラムダ式に挑戦!
復習なので、当日、櫻庭さんが言った内容そのままの書き起こしではなく、自分なりにまとめたものになっています。そのため、間違っているところもあると思うので、間違い指摘…大歓迎です!
…環境設定からのつづき…
Java SE 8で追加された機能で目立つものを上げる
- ラムダ式 : これは、言語機能で、文法が今までのJavaと違う。
- Stream API : 配列内の要素操作をストリームとして操作できるようにするAPIの追加。ラムダ式とセットで覚えたほうがいい。
- Date and Time API : 日付・時間関連のAPIが変わった。使い勝手がよくなった。
詳しくは→JDK 8の新機能
このうち、今回の勉強会の話題は、ラムダ式の基礎とStream APIをほんの少し。
ラムダ式やStream APIが追加されたバックグラウンド
そもそも、今回のテーマになっている内容について、なんでこのようなものがJava SE 8で追加されたのかというバックグラウンドを知っておいてください…というお話から勉強会はスタートしました。
ハードウエア面でマルチコア化が進んできたので、並列処理が効率よく行われるようなソフトウェアを作ることが必要になってきた。Javaも、それに対応させるということで登場したのが、Project Lambda。
(追加参考として、↓
が、分かりやすいと思います。)
並列処理を効率よくするためには、並列処理の粒度を小さくする記述方法が必要になってくる…ということで、ラムダ式の書き方が必要になった。どんな処理のところが並列化しやすいかというと、配列全体を何かする処理や、非同期処理のところ。
そして、Project Lambdaで追加となったもののうち、代表的なものが、今回取り上げたラムダ式とStream API。
↑の、4~7枚目にあるように、講師の櫻庭さんは、内部イテレータと外部イテレータの話も含めて説明してくださっていたのだけれど…すいません…写真撮ったりしてたので聞いてませんでした。誰かあとで補足してください…。
ラムダ式とは?
Lambda式は、匿名クラスをシンプルに記述することができるもので、関数型言語の関数をオブジェクト的な書き方で表すもの。どんな場面でLambda式を使うかというと、関数型インタフェースと言われるものを書くところに使われる。
匿名クラスとは?
内部クラスの一種で、あるクラスのメソッド内で宣言されていてクラス名を持っていないもの。使われる場面としては、スレッドを使った処理やGUIを持つクライアントサイドのJavaアプリを作るところ。(Webアプリだと匿名クラスを使う場面は少ないのかも。)
匿名クラスという言い方が正しいのですが、無名クラスと書いてある記事なども見かけます…と櫻庭さんが言ってました。
関数型言語とは?
手続き型言語でないもの。CとかJavaは手続き型。LispやScalaは関数型言語。
関数型インタフェースとは?
実装すべきメソッドが1つだけのインタフェース。代表的なものは、java.lang.Runnableインタフェース。
Stream APIとは?
ストリームというのは「流れ」という意味です。今回でてきたStream APIは、データストリームを扱うものです。java.util.streamパッケージです。APIリファレンスを見ると、「要素のストリームに対する関数型の操作をサポートするクラス」と書いてあります。
java.util.stream (Java Platform SE 8)
これは、Collections Frameworkの一部です。
Collections Framework Enhancements in Java SE 8
で。
これを使って、配列の要素を1つづつfor文で取り出すやり方(これが外部イテレーション)で処理を行う方法ではなく、ラムダ式を使った内部イテレーションな方法で記述するようになりました。(for文グルグルでも書けるけど。)for文禁止とか言われているところは、この部分のことです。
(追加参考として、
Java Advent Calendar 2013 5日目 - Java 8 Stream APIを学ぶ - kagamihogeの日記
も読んでみてください。)
ストリームという名前だけ聞いて「ファイルIOのこと??」と思ってしまっていた人もあったようですが、違います。(ファイルIOはファイルストリームというものです。ファイルストリームのパッケージは、java.ioパッケージです。)
…ここまで、ぜんぜんコード出てませんが、コードは、また続きで書きます。
…つづく。