Java8新機能
ラムダ式とストリーム
API
2016年3月度定例会
張田浩明 全43枚
1
目次
• 本日のテーマ
• ラムダ式とは?StreamAPIとは?
• ラムダ式基礎
• ラムダ式使用例
• ストリームAPIの基礎
• ストリームAPIの使用例
• メリットは?
• まとめ
• 質疑応答
2
目次
• 本日のテーマ
• ラムダ式とは?StreamAPIとは?
• ラムダ式基礎
• ラムダ式使用例
• ストリームAPIの基礎
• ストリームAPIの使用例
• メリットは?
• まとめ
• 質疑応答
3
Java8使うならJava8らしく描こうよ!!
4
目次
• 本日のテーマ
• ラムダ式とは?StreamAPIとは?
• ラムダ式基礎
• ラムダ式使用例
• ストリームAPIの基礎
• ストリームAPIの使用例
• メリットは?
• まとめ
• 質疑応答
5
ラムダ式とストリームAPI
 ラムダ式とは関数を簡便に表現するための記法。
 ストリームAPIは、ラムダ式を利用したコレクション操作用の
API
6
7
1. フルーツの一覧の中から
2. 名前が”りんご“で始まり
3. 値段が100円以上のものを、
4. 値段順で並び替えたものを
5. 名前だけ取り出して、
6. リスト作成する
簡単なサンプル
目次
• 本日のテーマ
• ラムダ式とは?StreamAPIとは?
• ラムダ式基礎
• ラムダ式使用例
• ストリームAPIの基礎
• ストリームAPIの使用例
• メリットは?
• まとめ
• 質疑応答
8
9
なぜラムダ式が必要になったのか
• 並列処理が当たり前に使われるようになり、ラムダ
式の必要性が高まった。
Microsoftの提案を受け入れていれば、ラムダ式が
もっと早く入っていたかもしれない。。
10
目次
• 本日のテーマ
• ラムダ式とは?StreamAPIとは?
• ラムダ式基礎
• ラムダ式使用例
• ストリームAPIの基礎
• ストリームAPIの使用例
• メリットは?
• まとめ
• 質疑応答
11
ラムダ式使用例
• リストの中身を1つずつ取り出して処理するためforEachというメソッ
ドが
追加されている。
• list.forEach(中身を1つずつ取り出してそれぞれに対してした
いこと );
• 「リストの中身を1つずつ取り出してそれぞれに対してしたいこと」を、
Javaのコードとしてどう書くのか?
• forEach メソッドのシグネチャを見てみると、Consumer クラスを引
数に取るらしい。 12
ラムダ式使用例
• Consumerクラスの実装はこんな感じ
13
ラムダ式使用例
• つまり forEach メソッドを使って、リストの中身を1つず
つ取り出して出力したいとなると、下記のような
Consumer オブジェクトを引数に渡す必要がある。
14
15
『なにこれJavaうざい。。
めんどくさい』
とモダンな方々なら思うよね絶対
16
ここでラムダ式の出番!!!
17
ここでラムダ式の出番!!!
そもそもラムダ式ってなんだ??
ラムダ式とは、
• 関数を第一級オブジェクトとして扱えるようにしたもの
• JVMで関数を直接扱えるようになったわけではなく、内
部的にはクラスのインスタンスを使って表現している。
• ラムダ式で記述すると自動的に並列処理化される!
18
ラムダ式使用例
19
アロー演算子
(ハイフン( - ) +大なり( > ))
ラムダ式書き方
(引数) -> 引数に対して行いたい処理
___________________________________________________________________________________________________
//引数が一つ
(x) -> x * x
x -> x <= 10
________________________________________________
//引数が二つ
( int x , int y )-> {
return x + y;
}
( x , y ) -> x + y 20
メソッドとして考えれば
イメージ湧きやすい!!!
使い方:メソッド参照
• ラムダ式だけでなく、既存のメソッドも関数型インタフェースで受け取ることが可能。
//ラムダ式を使った場合
list.forEach(x -> System.out.println(x));
//メソッド参照を使った場合
list.forEach(System.out :: println);
21
//複数行処理も可能
list.forEach(x -> {
System.out.println(x);
System.out.println(x);
});
目次
• 本日のテーマ
• ラムダ式とは?StreamAPIとは?
• ラムダ式基礎
• ラムダ式使用例
• ストリームAPIの基礎
• ストリームAPIの使用例
• メリットは?
• まとめ
• 質疑応答
22
ストリームAPIとは
• パイプライン型のデータ処理のAPI
• 絞り込み、データ変換、グループ化、集計など
の操作をそれぞれ分離した形で記述できる。
• 絞り込みの条件や、加工方法などをラムダ式で指定
する。
• メソッドチェーン形式で記述できる。
• Listや配列などの集合要素に対して、逐次的もしくは並
行的に処理を提供するクラス
23
ストリームパイプライン
• 処理をメソッドチェーンで記述する
• ソース ( Source )
• 中間操作 ( Intermediate Operation )
• 終端操作 ( Terminal Operation )
• ストリームパイプラインは、1つ以上のソース、0個以上の
中間操作、1つの終端操作から構成される。
• 終端操作の結果をソースとして処理を継続させることも
可能。
(終端操作の後にメソッドチェイン可能) 24
サンプル
25
1行目がソース
2~5行目までが中間操作
6行目が終端操作
ストリームパイプラインの挙動
26
ソース
• 既存のデータからStream型のオブジェクトを作る。
• Streamの種類
Stream<T>
IntStream , LongStream , DoubleStream
• つくりかた
Collection.stream()
Arrays.stream()
Stream.of(Object…)
27
bufferReader.lines()
IntStream.range(int,int)
中間操作
• 絞り込みや写像などの操作を指定して、新しいStreamを返
す。
• 遅延実行
処理方法を指定するだけで、実際には処理しない。
中間操作を呼び出すたびにループしてたら効率が悪い。
終端操作が呼ばれた時に、複数の中間操作をまとめてルー
プ処理
• 処理の種類
・絞り込み : filter
・オブジェクト変換 : map,flatMap
・並び替え : sorted 28
・数の制御 : limit , skip
・同一要素除外 : distinct
Etc…
終端操作
• ストリームパイプラインを実行して、何らかの結果を取得する処
理。
forEachだけは戻り値を返さない。
• 処理の種類
• 畳み込み : collect , reduce
• 集計: min , max , average , sum , count
• 単一の値の取得: findFirst , findAny
• 要素の検証: allMatch , anyMatch , noneMatch
• 繰り返し: forEach , forEachOrdered 29
Etc…
目次
• 本日のテーマ
• ラムダ式とは?StreamAPIとは?
• ラムダ式基礎
• ラムダ式使用例
• ストリームAPIの基礎
• ストリームAPIの使用例
• メリットは?
• まとめ
• 質疑応答
30
中間操作使用方法 : filter, map
31
• Filter
• Map
__________________________
_________________________
//結果 : 300
400
500
//結果 : ”100”
”200”
“300”
“400”
“500”
中間操作使用方法 : distinct, sored
32
• Distinct
_____________
• Sorted
__________
※ List#sortメソッドが追加されている為、Streamに変換しなくても
ソートすることは可能
※ .reverse()を追加することで降順でソートが可能になる。
//結果 : 100
200
300
//結果 : 100
200
300
400
500
終端操作使用方法 :anyMatch
33
• AnyMatch, AllMatch, NoneMatch
___________________________________________
結果 : b = true;
ショートカットサーキット評価の終
端操作
• 例えば、Stream#countは全要素をループで回す
ので時間がかかるが、Stream#findAnyはショート
サーキット評価なので,1つ目の要素が見つかれば
すぐに終わる。
34
終端操作使用方法 :collect
35
• ToList
_______________________________________________
目次
• 本日のテーマ
• ラムダ式とは?StreamAPIとは?
• ラムダ式基礎
• ラムダ式使用例
• ストリームAPIの基礎
• ストリームAPIの使用例
• メリットは?
• まとめ
• 質疑応答
36
メリット
パイプライン記述だから処理内容が見やすい
・保守性の向上
・可読性の向上
簡単に並列実行できるようになる。
->ラムダ式を用いることで自動的に並列処理
lists.stream().parallel() -> 使ったことないから詳しいこ
とは説明できません。。
37
保守性が向上する…?
処理の追加・削除・順番の入れ替えなどがやりやすい
再利用性やテスタビリティも向上するかも。
38
39
可読性は..?
• 野球選手の一覧から、チームごとの投手の平均年俸を取得する処理の例
• 気をつけないとすぐに読みにくくなる
• stream()とかstream()とかstream()とかノイズが多い。
目次
• 本日のテーマ
• ラムダ式とは?StreamAPIとは?
• ラムダ式基礎
• ラムダ式使用例
• ストリームAPIの基礎
• ストリームAPIの使用例
• メリットは?
• まとめ
• 質疑応答
40
まとめ
• ラムダ式
• 慣れたらラムダ式以外で書く術が考えられなくなる・・
• デメリットも少ないし使わない手はないよね
• ストリームAPI
• 慣れるまでは読み書きも難しいし、バグを生みやすいかもしれない。
• でも慣れると少ない記述で複雑な処理が実行できる。
そして何より書いていて楽しい!
(java7以前をバリバリ書いていた人なら絶対思っているはず。。)
• しかし、標準で用意されてる機能が少ない気がします。。。。。
• 今後は独自で拡張する輩が出てきてオレオレコードが拡散するか
も???
41
目次
• 本日のテーマ
• ラムダ式とは?StreamAPIとは?
• ラムダ式基礎
• ラムダ式使用例
• ストリームAPIの基礎
• ストリームAPIの使用例
• まとめ
• メリットは?
• 質疑応答
42
43
ご静聴ありがとうございました。

3月度定例会プレゼン資料 張田浩明 最新

Editor's Notes

  • #7 パラダイムシフト -> 革命