Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Java8のStreamとLambdaの関係
Search
bvlion
July 21, 2017
Programming
0
130
Java8のStreamとLambdaの関係
もうそろそろStreamやLambdaは書けるようになっておきましょう。
bvlion
July 21, 2017
Tweet
Share
More Decks by bvlion
See All by bvlion
View周りで後悔しない実装
iwaisatoshi
0
250
それは本当にRailsでないとダメですか?
iwaisatoshi
0
310
Kotlinでテストコードを書く
iwaisatoshi
1
700
Kotlinで始めるAndroid開発
iwaisatoshi
0
150
Other Decks in Programming
See All in Programming
GAEログのコスト削減
mot_techtalk
0
120
DevinとCursorから学ぶAIエージェントメモリーの設計とMoatの考え方
itarutomy
1
670
Rails アプリ地図考 Flush Cut
makicamel
1
110
Linux && Docker 研修/Linux && Docker training
forrep
24
4.5k
密集、ドキュメントのコロケーション with AWS Lambda
satoshi256kbyte
0
190
CNCF Project の作者が考えている OSS の運営
utam0k
6
710
知られざるDMMデータエンジニアの生態 〜かつてツチノコと呼ばれし者〜
takaha4k
4
1.3k
[JAWS-UG横浜 #80] うわっ…今年のServerless アップデート、少なすぎ…?
maroon1st
1
180
パスキーのすべて ── 導入・UX設計・実装の紹介 / 20250213 パスキー開発者の集い
kuralab
3
730
一休.com のログイン体験を支える技術 〜Web Components x Vue.js 活用事例と最適化について〜
atsumim
0
320
Boost Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
120
AWS Lambda functions with C# 用の Dev Container Template を作ってみた件
mappie_kochi
0
240
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
244
12k
Optimising Largest Contentful Paint
csswizardry
34
3.1k
The Language of Interfaces
destraynor
156
24k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.4k
BBQ
matthewcrist
86
9.5k
Scaling GitHub
holman
459
140k
A Philosophy of Restraint
colly
203
16k
Music & Morning Musume
bryan
46
6.3k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Building Adaptive Systems
keathley
40
2.4k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
3
320
Unsuck your backbone
ammeep
669
57k
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
ありがとうございました!!