Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Sumire Aoki
Search
Sumire Aoki
November 12, 2023
1.4k
7
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Sumire Aoki
「ラムダ式をHowではなくWhyで理解しよう!」
2023/11/11 JJUG CCC Fall にて登壇したときのスライド資料です
Sumire Aoki
November 12, 2023
More Decks by Sumire Aoki
See All by Sumire Aoki
Java子誕生のコミュニティJPIN
sumirecheese
0
260
Featured
See All Featured
How to make the Groovebox
asonas
2
2.4k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
520
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Leo the Paperboy
mayatellez
8
2.3k
My Coaching Mixtape
mlcsv
0
310
Designing for Performance
lara
611
70k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
65k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
570
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Transcript
ラムダ式を Howではなく Whyで 理解しよう! SUMIRE AOKI(JAVA子) 2023/11/11
Agenda • 自己紹介 • 今日の狙い • ラムダ式とは?(How) • ラムダ式はなぜできたのか(Why)
青木 澄怜 Aoki Sumire 職歴 :SE1年目 コミュニティ :JPIN すきなもの① :Java
すきなもの② :チーズ あだ名 :Java子
Agenda • 自己紹介 • 今日の狙い • ラムダ式とは?(How) • ラムダ式はなぜできたのか(Why)
私、ラムダ式 すっごい苦手でした!!
Howだけ説明されても分からないんです • 例)傘を知らない人に傘を説明してみよう(How) 開けば使えます。 は…はぁ (盾か何かなのか?)
Howだけ説明されても分からないんです • 例)傘を知らない人に傘を説明してみよう(Why・How) なるほど~! 開けば使えます。 雨が降ったとき、 体を濡らさないための ものです。
Howだけ説明されても分からないんです ラムダ式もそう!!!(How) !?? ラムダ式はこう書けば 使えます! Hoge h = ()-> System.out.print(“hoge”);
ということでラムダ式を Whyで説明します! (ちょっとでもラムダ式って 面白いって思ってほしい!)
Agenda • 自己紹介 • 今日の狙い • ラムダ式とは?(How) • ラムダ式はなぜできたのか(Why)
関数型インタフェースをアロー演算子を使って簡潔に記述したもの。 抽象メソッドを一つしか持たないインタフェース。 ラムダ式とは(How) <基本構文> (type args, …) -> { statements
} type:引数の型 args:引数の名前 statements:処理本体
public interface Hoge { public void hoge(); } インタフェース 使う側のクラス
ラムダ式とは(How)実際のコード public class User { public static void main(String[] args) { Hoge h = () -> System.out.println("hoge"); h.hoge();//hogeと表示される } }
Agenda • 自己紹介 • 今日の狙い • ラムダ式とは?(How) • ラムダ式はなぜできたのか(Why)
ラムダ式のWhyを一言で言うと 情報隠蔽の終着点
「何に困ってラムダ式が生まれたんだろう?」 Why
そもそもラムダ式が無い場合は どう書くか見ていきましょう!
<<interface>> CheeseInterface MozzarellaCheese User
そもそも インタフェースがなぜ存在するか 考えたことありますか…?
ラムダ式の理解には インタフェースの理解が 大前提なんです
インタフェースはなぜ存在するか 使う側への思いやり
インタフェース・・・規約、ルール(扱い方)を定めたもの イメージ例)スマホの充電器
インタフェースが無いとどうなるか? iPhone8 iPhoneX iPhone8用 iPhoneX用・・・
「iPhoneの充電器は これ!!」 iPhone8 iPhoneX どのiPhoneでも 同じ充電器で良くなる!!
Javaのコードで言うと? User MozzarellaCheese CamembertCheese
Javaのコードで言うと? public class User { public static void main(String[] args)
{ //モッツァレラチーズの仕様の場合 MozzarellaCheese m = new MozzarellaCheese(); //カマンベールチーズの仕様の場合 CamembertCheese c = new CamembertCheese(); いちいち型(扱い方)を変えないといけなくて面倒…
Cheeseインタフェースを用意してみましょう! User MozzarellaCheese CamembertCheese
<<interface>> CheeseInterface User MozzarellaCheese CamembertCheese Cheeseインタフェースを用意しましょう!
型を気にしなくてよくなりました!
インタフェースはなぜ存在するか 使う側への思いやり
実装クラスや変更を見せる必要無いですよね… こんな時使える 便利なデザインパターンが あるんです!!
オブジェクト生成を専門に担当するクラスを導入することで、 使う側のクラスが生成のプロセス(変更)を意識する必要が無くなる設計。 Factoryデザインパターン Factory User A B
今回のコードに当てはめると・・・ <<interface>> CheeseInterface User MozzarellaCheese CamembertCheese
こんな感じ <<interface>> CheeseInterface User MozzarellaCheese CamembertCheese Factory
Factoryクラスを作る前 User mozzarellaChees e
Factoryクラス作成後 User mozzarellaChees e CamembertCheese 使う側のクラスから変更を何も意識しなくてよくなった!!
これでクライアントとオブジェクトの具体的な実装を 分離することができました!
大変お待たせしました ここからラムダ式の話します (遅い)
「このMozzarellaCheeseクラス、危険だな」
何かのクラス 別のクラス Factoryクラス以外から アクセスできないように してしまいたい
「これをいっそのこと・・・」
「Factoryクラスに隠しちゃえ!」 ※インナークラス ※privateなインナークラス
「これで他からアクセスできない!」 何かのクラス 別のクラス ※privateなインナークラス
public class Factory { public static CheeseInterface create() { return
new MozzarellaCheese(); } private static class MozzarellaCheese implements CheeseInterface{ @Override public void desc() { System.out.println("mozzarellaCheese"); } } }
「このクラスcreateメソッドからしか 使われてないなぁ…」 Factoryクラス createメソッド MozzarellaCheeseクラス(インナークラス)
「複数のメソッドから使われてる わけでもないし・・・」 Factoryクラス createメソッド MozzarellaCheeseクラス(インナークラス) 他のメソッド
「createメソッドに隠しちゃえ!」 Factoryクラス createメソッド MozzarellaCheeseクラス(インナークラス)
Factoryクラス createメソッド MozzarellaCheeseクラス 「createメソッドに隠しちゃえ!」 ※ローカルクラス
コードで書くとこんな感じです ※ローカルクラス
「ここでしか使わないならクラスの名前つける必要ないな・・・」
「名無しで処理だけ定義しちゃえ!」 ※匿名クラス
匿名クラスとは・・・新しくクラスを作成せずに インタフェース(抽象クラス)を実装できるもの インタフェース 実装クラス 使う側のクラス インタフェース 使う側のクラス <匿名クラス> <従来の実装方法> ※インタフェース(抽象クラス)
のメソッド数に制限はありません
インナークラスから匿名クラスの コードの変化を 見てみましょう!
public class Factory { public static CheeseInterface create() { return
new MozzarellaCheese(); } private static class MozzarellaCheese implements CheeseInterface{ @Override public void desc() { System.out.println("mozzarellaCheese"); } } } インナークラス 「createメソッドに隠したいな」
public class Factory { public static CheeseInterface create() { class
MozzarellaCheese implements CheeseInterface{ @Override public void desc() { System.out.println("mozzarellaCheese"); } } return new MozzarellaCheese(); } } ローカルクラス 「クラスの名前つける必要ないな」
public class Factory { public static CheeseInterface create() { class
MozzarellaCheese implements CheeseInterface{ @Override public void desc() { System.out.println("mozzarellaCheese"); } } return c; } } ローカルクラス
public class Factory { public static CheeseInterface create() { CheeseInterface
c = new CheeseInterface() { @Override public void desc() { System.out.println("mozzarellaCheese"); } }; return c; } } 匿名クラス
「あー、かなりコードがすっきりした! …いや、待てよ?」 public class Factory { public static CheeseInterface create()
{ CheeseInterface c = new CheeseInterface() { @Override public void desc() { System.out.println("mozzarellaCheese"); } }; return new MozzarellaCheese(); } }
「インタフェースの メソッドが一つなら、 もっと省略出来るのでは…?」
public interface CheeseInterface { public void desc(); } CheeseInterface c
= new CheeseInterface() { @Override public void desc() { System.out.println("mozzarellaCheese"); } }; ←インタフェース ↓匿名クラス
public interface CheeseInterface { public void desc(); } CheeseInterface c
= new CheeseInterface() { @Override public void desc() { System.out.println("mozzarellaCheese"); } }; ←インタフェース ↓匿名クラス
public interface CheeseInterface { public void desc(); } CheeseInterface c
= new CheeseInterface() { @Override public void desc() { System.out.println("mozzarellaCheese"); } }; ←インタフェース ↓匿名クラス
お待たせしました!ラムダ式の登場です!
ラムダ式のWhyを一言で言うと 情報隠蔽の終着点
Whyから理解することで ラムダ式のイメージは 変わりましたか?
Whyを理解した今だからこそ、 Howを知りたくなりませんか?
ありがとうございました X @Sumirecheese