Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Java8のStreamとLambdaの関係

 Java8のStreamとLambdaの関係

もうそろそろStreamやLambdaは書けるようになっておきましょう。

Acb890a6861c2f2bc5a8968e3ff20094?s=128

bvlion

July 21, 2017
Tweet

Transcript

  1. 若干今さら… Java8のStreamとLambda 2017/07/21 @一部の社内向け 岩井 大志

  2. 自己紹介 名前 ・岩井 大志(Iwai Satoshi)  高卒遅咲き(26歳から)エンジニア お仕事 ・SE@株式会社クロノス ・JavaやKotlinでWebやAndroidの開発  (予定)

    個人の活動 ・Twitter @ninjinx
  3. 今日のお題 ⇨ StreamとLambda

  4. 今回はザックリ知ってるStreamを、そこそこの理解に もっていくことを目的としています<(_ _)> なのでStreamは少し使ったことがある前提で進めます。。。 細かい質問もあろうかと思いますが、 私も全APIを知ってるとか、めっちゃ詳しいとかでもないので 不明点は一緒に調べたれたら幸いです(^ω^;) ただ、もうリリースされて3年、今年2017年7月には Java9がリリースされる予定なので、 そこそこ理解して使えるようになりましょう(*・ω・)ノ

    ※ ちなみにJava9のつまみ食いでは、   Lambdaがさらに簡素に書けるようになっています (^w^)
  5. ・中間操作   ・map   ・filter ・終端操作   ・collect   ・forEach ・etc……. Streamにはたくさんの機能があります! と、Lambdaの関係 を、話したいと思います

    (*・ω・)ノ
  6. まずはLambdaについて知ろう! Lambdaとは… 私の中でですが、匿名 IFの関数を使ったプログラミングだと思っています。 ・関数型プログラミング ≒ 1つの入力に対し1つの返却値がある  (その中で値が変わってしまってはいけない)← レガシーエンジニアがたまにやるオブジェクト参照による値の変更 ・匿名

    ≒ 無名クラス(インターフェース) つまり、Javaでは 無名クラスで1つずつのInとOutを行うプログラミング と思っておけばいいかと思います (・∀・) これをJava8では簡素に書けるようになりました! ※ あくまでザックリの認識として、言葉尻を気にせずに理解していただければと思います(^ω^;)
  7. Streamのmapとは… mapは典型的なLambdaで、1つの入力(変換結果)に対し、 それを変換して1つの値(Stream)を返してくれます。 StreamはIFですので、定義はこんな感じです(・∀・)

  8. Streamのmapとは… ここで湧き上がる疑問… この引数になってる Functionって何??(・ω・;)

  9. Functionとは… FunctionもIFの1つで、applyで変換を行ってくれます( `・ω・´) これもIFだけど、見ての通り 型引数TをRに変換する …というのは 理解できるかと思います ( `・ω・´)

  10. FunctionをJava7風に実装すると?? Functionクラスを使ってStringをIntegerに変換するとこうなります。

  11. ちょっとダサい(´・ω・`)

  12. FunctionをLambdaで実装してみる! Functionクラスを使ってStringをIntegerに変換するとこうなります。

  13. ちょっと良くなった(・∀・)

  14. 1行で返せる場合、括弧を省略できます! このFunctionは こうすることができます。 いわゆる単一式関数ですね(*・ω・)ノ…多分

  15. メソッド参照という機能を使ってみる! Java8のLambdaにはメソッド参照という機能があり「::」で 呼び出すことができます(・∀・) これを こうできます( `・ω・´)

  16. メソッド参照という機能を使ってみる! これらの冗長な部分を … このように置き換えられます。

  17. メソッド参照の指定の仕方 staticメソッド  クラス名::メソッド 自クラスメソッド  this::メソッド インスタンスメソッド  インスタンス::メソッド 引数インスタンス  クラス名::メソッド

  18. 他のもイメージは 大体こんな感じです(・∀・)

  19. Java7だとこういう感じで書いてたものが Java8のStreamで1行になります! Streamの良さを体感しよう!

  20. 検査例外の仕組みの失敗… Java7以前の無名関数を書いてた頃から、元々のメソッドにthrowがなければ 新たにthrowできないことを覚えてらっしゃるでしょうか? 検査例外の仕組みの失敗などと呼ばれ、Javaの仕様ミスの1つです。。。 ただ、Streamの場合は基本機能(forなど)の拡張IFなので、 そうも言ってられません。 そこでUncheckedIOExceptionが定義されました( `・ω・´) Streamを使っててthrowしなければならない場合は、 こちらを使用しましょう(*・ω・)ノ

  21. まとめ ・Lambdaは難しくない ・これに慣れると関数型言語に近づける ・Streamは美しい ・Exceptionだけは気をつけたい Javaはこれからも進化するので、私たちもガンバって 追いついていきましょう( `・ω・´)

  22. ちなみに今回のソースですが… まとめてGistの方に上げてありますので よかったら参考にしてください(*・ω・)ノ https://gist.github.com/bvlion/7984734b70666173f60c287f50a26931

  23. ありがとうございました!!