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
Sumire Aoki
Search
Sumire Aoki
November 12, 2023
7
870
Sumire Aoki
「ラムダ式をHowではなくWhyで理解しよう!」
2023/11/11 JJUG CCC Fall にて登壇したときのスライド資料です
Sumire Aoki
November 12, 2023
Tweet
Share
More Decks by Sumire Aoki
See All by Sumire Aoki
Java子誕生のコミュニティJPIN
sumirecheese
0
190
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
405
65k
A Tale of Four Properties
chriscoyier
156
23k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
93
16k
Designing for Performance
lara
604
68k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
27
840
Speed Design
sergeychernyshev
24
610
4 Signs Your Business is Dying
shpigford
180
21k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Why Our Code Smells
bkeepers
PRO
334
57k
Art, The Web, and Tiny UX
lynnandtonic
297
20k
For a Future-Friendly Web
brad_frost
175
9.4k
Thoughts on Productivity
jonyablonski
67
4.3k
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