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