$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Java8のStreamとLambdaの関係
Search
bvlion
July 21, 2017
Programming
0
140
Java8のStreamとLambdaの関係
もうそろそろStreamやLambdaは書けるようになっておきましょう。
bvlion
July 21, 2017
Tweet
Share
More Decks by bvlion
See All by bvlion
View周りで後悔しない実装
iwaisatoshi
0
270
それは本当にRailsでないとダメですか?
iwaisatoshi
0
330
Kotlinでテストコードを書く
iwaisatoshi
1
780
Other Decks in Programming
See All in Programming
從冷知識到漏洞,你不懂的 Web,駭客懂 - Huli @ WebConf Taiwan 2025
aszx87410
2
2.9k
脳の「省エネモード」をデバッグする ~System 1(直感)と System 2(論理)の切り替え~
panda728
PRO
0
110
TestingOsaka6_Ozono
o3
0
170
Findy AI+の開発、運用におけるMCP活用事例
starfish719
0
1.6k
ハイパーメディア駆動アプリケーションとIslandアーキテクチャ: htmxによるWebアプリケーション開発と動的UIの局所的適用
nowaki28
0
440
愛される翻訳の秘訣
kishikawakatsumi
3
330
C-Shared Buildで突破するAI Agent バックテストの壁
po3rin
0
410
Jetpack XR SDKから紐解くAndroid XR開発と技術選定のヒント / about-androidxr-and-jetpack-xr-sdk
drumath2237
1
160
組み合わせ爆発にのまれない - 責務分割 x テスト
halhorn
1
160
新卒エンジニアのプルリクエスト with AI駆動
fukunaga2025
0
230
Github Copilotのチャット履歴ビューワーを作りました~WPF、dotnet10もあるよ~ #clrh111
katsuyuzu
0
120
これならできる!個人開発のすゝめ
tinykitten
PRO
0
120
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
698
190k
Done Done
chrislema
186
16k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
0
68
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
0
26
Visualization
eitanlees
150
16k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
How to Ace a Technical Interview
jacobian
281
24k
Evolving SEO for Evolving Search Engines
ryanjones
0
72
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
400
ラッコキーワード サービス紹介資料
rakko
0
1.7M
エンジニアに許された特別な時間の終わり
watany
105
220k
Transcript
若干今さら… Java8のStreamとLambda 2017/07/21 @一部の社内向け 岩井 大志
自己紹介 名前 ・岩井 大志(Iwai Satoshi) 高卒遅咲き(26歳から)エンジニア お仕事 ・SE@株式会社クロノス ・JavaやKotlinでWebやAndroidの開発 (予定)
個人の活動 ・Twitter @ninjinx
今日のお題 ⇨ StreamとLambda
今回はザックリ知ってるStreamを、そこそこの理解に もっていくことを目的としています<(_ _)> なのでStreamは少し使ったことがある前提で進めます。。。 細かい質問もあろうかと思いますが、 私も全APIを知ってるとか、めっちゃ詳しいとかでもないので 不明点は一緒に調べたれたら幸いです(^ω^;) ただ、もうリリースされて3年、今年2017年7月には Java9がリリースされる予定なので、 そこそこ理解して使えるようになりましょう(*・ω・)ノ
※ ちなみにJava9のつまみ食いでは、 Lambdaがさらに簡素に書けるようになっています (^w^)
・中間操作 ・map ・filter ・終端操作 ・collect ・forEach ・etc……. Streamにはたくさんの機能があります! と、Lambdaの関係 を、話したいと思います
(*・ω・)ノ
まずはLambdaについて知ろう! Lambdaとは… 私の中でですが、匿名 IFの関数を使ったプログラミングだと思っています。 ・関数型プログラミング ≒ 1つの入力に対し1つの返却値がある (その中で値が変わってしまってはいけない)← レガシーエンジニアがたまにやるオブジェクト参照による値の変更 ・匿名
≒ 無名クラス(インターフェース) つまり、Javaでは 無名クラスで1つずつのInとOutを行うプログラミング と思っておけばいいかと思います (・∀・) これをJava8では簡素に書けるようになりました! ※ あくまでザックリの認識として、言葉尻を気にせずに理解していただければと思います(^ω^;)
Streamのmapとは… mapは典型的なLambdaで、1つの入力(変換結果)に対し、 それを変換して1つの値(Stream)を返してくれます。 StreamはIFですので、定義はこんな感じです(・∀・)
Streamのmapとは… ここで湧き上がる疑問… この引数になってる Functionって何??(・ω・;)
Functionとは… FunctionもIFの1つで、applyで変換を行ってくれます( `・ω・´) これもIFだけど、見ての通り 型引数TをRに変換する …というのは 理解できるかと思います ( `・ω・´)
FunctionをJava7風に実装すると?? Functionクラスを使ってStringをIntegerに変換するとこうなります。
ちょっとダサい(´・ω・`)
FunctionをLambdaで実装してみる! Functionクラスを使ってStringをIntegerに変換するとこうなります。
ちょっと良くなった(・∀・)
1行で返せる場合、括弧を省略できます! このFunctionは こうすることができます。 いわゆる単一式関数ですね(*・ω・)ノ…多分
メソッド参照という機能を使ってみる! Java8のLambdaにはメソッド参照という機能があり「::」で 呼び出すことができます(・∀・) これを こうできます( `・ω・´)
メソッド参照という機能を使ってみる! これらの冗長な部分を … このように置き換えられます。
メソッド参照の指定の仕方 staticメソッド クラス名::メソッド 自クラスメソッド this::メソッド インスタンスメソッド インスタンス::メソッド 引数インスタンス クラス名::メソッド
他のもイメージは 大体こんな感じです(・∀・)
Java7だとこういう感じで書いてたものが Java8のStreamで1行になります! Streamの良さを体感しよう!
検査例外の仕組みの失敗… Java7以前の無名関数を書いてた頃から、元々のメソッドにthrowがなければ 新たにthrowできないことを覚えてらっしゃるでしょうか? 検査例外の仕組みの失敗などと呼ばれ、Javaの仕様ミスの1つです。。。 ただ、Streamの場合は基本機能(forなど)の拡張IFなので、 そうも言ってられません。 そこでUncheckedIOExceptionが定義されました( `・ω・´) Streamを使っててthrowしなければならない場合は、 こちらを使用しましょう(*・ω・)ノ
まとめ ・Lambdaは難しくない ・これに慣れると関数型言語に近づける ・Streamは美しい ・Exceptionだけは気をつけたい Javaはこれからも進化するので、私たちもガンバって 追いついていきましょう( `・ω・´)
ちなみに今回のソースですが… まとめてGistの方に上げてありますので よかったら参考にしてください(*・ω・)ノ https://gist.github.com/bvlion/7984734b70666173f60c287f50a26931
ありがとうございました!!