43
Java8 新新新 新新新新新新新新新新 API 2016 新 3 新新新新新 新新新新 新 43 新 1

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

  • Upload
    hharita

  • View
    83

  • Download
    0

Embed Size (px)

Citation preview

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

1

Java8新機能ラムダ式とストリー

ム API2016 年 3 月度定例会

張田浩明 全 43枚

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

2

目次• 本日のテーマ• ラムダ式とは? StreamAPI とは?• ラムダ式基礎• ラムダ式使用例• ストリーム API の基礎• ストリーム API の使用例• メリットは?• まとめ• 質疑応答

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

3

目次•本日のテーマ• ラムダ式とは? StreamAPI とは?• ラムダ式基礎• ラムダ式使用例• ストリーム API の基礎• ストリーム API の使用例• メリットは?• まとめ• 質疑応答

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

4

Java8 使うなら Java8 らしく描こうよ!!

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

5

目次• 本日のテーマ• ラムダ式とは? StreamAPI とは?• ラムダ式基礎• ラムダ式使用例• ストリームAPI の基礎• ストリームAPI の使用例• メリットは?• まとめ• 質疑応答

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

6

ラムダ式とストリーム API

ラムダ式とは関数を簡便に表現するための記法。ストリーム API は、ラムダ式を利用したコレクション操作用の API

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

7

1. フルーツの一覧の中から2. 名前が”りんご“で始まり3. 値段が 100 円以上のものを、4. 値段順で並び替えたものを5. 名前だけ取り出して、6. リスト作成する

簡単なサンプル

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

8

目次• 本日のテーマ• ラムダ式とは? StreamAPI とは?• ラムダ式基礎• ラムダ式使用例• ストリーム API の基礎• ストリーム API の使用例• メリットは?• まとめ• 質疑応答

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

9

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

10

なぜラムダ式が必要になったのか• 並列処理が当たり前に使われるようになり、ラムダ式の必要性が高まった。

Microsoft の提案を受け入れていれば、ラムダ式がもっと早く入っていたかもしれない。。

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

11

目次• 本日のテーマ• ラムダ式とは? StreamAPI とは?• ラムダ式基礎• ラムダ式使用例• ストリーム API の基礎• ストリーム API の使用例• メリットは?• まとめ• 質疑応答

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

12

ラムダ式使用例• リストの中身を 1 つずつ取り出して処理するため forEachというメソッドが追加されている。

• list.forEach( 中身を1つずつ取り出してそれぞれに対してしたいこと );• 「リストの中身を1つずつ取り出してそれぞれに対してしたいこと」を、

Java のコードとしてどう書くのか?• forEach メソッドのシグネチャを見てみると、 Consumer クラスを引数に取るらしい。

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

13

ラムダ式使用例• Consumer クラスの実装はこんな感じ

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

14

ラムダ式使用例• つまり forEach メソッドを使って、リストの中身を1つずつ取り出して出力したいとなると、下記のような Consumer オブジェクトを引数に渡す必要がある。

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

15

『なにこれ Java うざい。。めんどくさい』とモダンな方々なら思うよね絶対

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

16

ここでラムダ式の出番!!!

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

17

ここでラムダ式の出番!!!そもそもラムダ式ってなんだ??

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

18

ラムダ式とは、• 関数を第一級オブジェクトとして扱えるようにしたもの• JVM で関数を直接扱えるようになったわけではなく、内部的にはクラスのインスタンスを使って表現している。• ラムダ式で記述すると自動的に並列処理化される!

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

19

ラムダ式使用例

アロー演算子( ハイフン ( - ) + 大なり ( > ))

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

20

ラムダ式書き方( 引数 ) -> 引数に対して行いたい処理___________________________________________________________________________________________________

// 引数が一つ(x) -> x * xx -> x <= 10________________________________________________

// 引数が二つ( int x , int y )-> { return x + y;}( x , y ) -> x + y

メソッドとして考えればイメージ湧きやすい !!!

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

21

使い方 : メソッド参照• ラムダ式だけでなく、既存のメソッドも関数型インタフェースで受け取ることが可能。

// ラムダ式を使った場合list.forEach(x -> System.out.println(x));// メソッド参照を使った場合list.forEach(System.out :: println);

// 複数行処理も可能list.forEach(x -> {

System.out.println(x);System.out.println(x);

});

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

22

目次• 本日のテーマ• ラムダ式とは? StreamAPI とは?• ラムダ式基礎• ラムダ式使用例• ストリーム API の基礎• ストリーム API の使用例• メリットは?• まとめ• 質疑応答

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

23

ストリーム API とは• パイプライン型のデータ処理の API• 絞り込み、データ変換、グループ化、集計などの操作をそれぞれ分離した形で記述できる。• 絞り込みの条件や、加工方法などをラムダ式で指定する。• メソッドチェーン形式で記述できる。• List や配列などの集合要素に対して、逐次的もしくは並行的に処理を提供するクラス

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

24

ストリームパイプライン• 処理をメソッドチェーンで記述する

• ソース ( Source ) • 中間操作 ( Intermediate Operation ) • 終端操作 ( Terminal Operation )

• ストリームパイプラインは、 1 つ以上のソース、0 個以上の中間操作、 1 つの終端操作から構成される。

• 終端操作の結果をソースとして処理を継続させることも可能。( 終端操作の後にメソッドチェイン可能 )

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

25

サンプル

1行目がソース2~5 行目までが中間操作6 行目が終端操作

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

26

ストリームパイプラインの挙動

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

27

ソース• 既存のデータから Stream 型のオブジェクトを作る。• Stream の種類

Stream<T>IntStream , LongStream , DoubleStream

• つくりかたCollection.stream()Arrays.stream()Stream.of(Object…)

bufferReader.lines()IntStream.range(int,int)

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

28

中間操作• 絞り込みや写像などの操作を指定して、新しい

Stream を返す。• 遅延実行処理方法を指定するだけで、実際には処理しない。中間操作を呼び出すたびにループしてたら効率が悪い。

終端操作が呼ばれた時に、複数の中間操作をまとめてループ処理• 処理の種類・絞り込み : filter・オブジェクト変換 : map,flatMap・並び替え : sorted

・数の制御 : limit , skip・同一要素除外 : distinct

Etc…

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

29

終端操作• ストリームパイプラインを実行して、何らかの結果を取得する処理。

forEach だけは戻り値を返さない。• 処理の種類

• 畳み込み : collect , reduce• 集計 : min , max , average , sum , count• 単一の値の取得 : findFirst , findAny• 要素の検証 : allMatch , anyMatch , noneMatch• 繰り返し : forEach , forEachOrdered

Etc…

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

30

目次• 本日のテーマ• ラムダ式とは? StreamAPI とは?• ラムダ式基礎• ラムダ式使用例• ストリーム API の基礎• ストリーム API の使用例• メリットは?• まとめ• 質疑応答

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

31

中間操作使用方法 : filter, map

• Filter

• Map

__________________________

_________________________

// 結果 : 300400500

// 結果 : ”100””200”“300”“400”“500”

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

32

中間操作使用方法 : distinct, sored

• Distinct

_____________• Sorted

__________

※ List#sort メソッドが追加されている為、 Stream に変換しなくても  ソートすることは可能 ※ .reverse() を追加することで降順でソートが可能になる。

// 結果 : 100200300

// 結果 : 100200300400500

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

33

終端操作使用方法 :anyMatch

• AnyMatch, AllMatch, NoneMatch

___________________________________________

結果 : b = true;

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

34

ショートカットサーキット評価の終端操作• 例えば、 Stream#count は全要素をループで回すので時間がかかるが、 Stream#findAny はショートサーキット評価なので ,1 つ目の要素が見つかればすぐに終わる。

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

35

終端操作使用方法 :collect

• ToList

_______________________________________________

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

36

目次• 本日のテーマ• ラムダ式とは? StreamAPI とは?• ラムダ式基礎• ラムダ式使用例• ストリーム API の基礎• ストリーム API の使用例• メリットは?• まとめ• 質疑応答

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

37

メリットパイプライン記述だから処理内容が見やすい・保守性の向上・可読性の向上簡単に並列実行できるようになる。

-> ラムダ式を用いることで自動的に並列処理lists.stream().parallel() -> 使ったことないから詳しいことは説明できません。。

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

38

保守性が向上する… ?処理の追加・削除・順番の入れ替えなどがやりやすい再利用性やテスタビリティも向上するかも。

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

39

可読性は .. ?• 野球選手の一覧から、チームごとの投手の平均年俸を取得する処理の例

• 気をつけないとすぐに読みにくくなる• stream() とか stream() とか stream() とかノイズが多い。

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

40

目次• 本日のテーマ• ラムダ式とは? StreamAPI とは?• ラムダ式基礎• ラムダ式使用例• ストリーム API の基礎• ストリーム API の使用例• メリットは?• まとめ• 質疑応答

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

41

まとめ• ラムダ式

• 慣れたらラムダ式以外で書く術が考えられなくなる・・• デメリットも少ないし使わない手はないよね

• ストリーム API• 慣れるまでは読み書きも難しいし、バグを生みやすいかもしれない。• でも慣れると少ない記述で複雑な処理が実行できる。そして何より書いていて楽しい!

(java7 以前をバリバリ書いていた人なら絶対思っているはず。。 )• しかし、標準で用意されてる機能が少ない気がします。。。。。• 今後は独自で拡張する輩が出てきてオレオレコードが拡散するかも???

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

42

目次• 本日のテーマ• ラムダ式とは? StreamAPI とは?• ラムダ式基礎• ラムダ式使用例• ストリーム API の基礎• ストリーム API の使用例• まとめ• メリットは?• 質疑応答

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

43

ご静聴ありがとうございました。