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
830
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
180
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
167
49k
Designing the Hi-DPI Web
ddemaree
280
34k
The Language of Interfaces
destraynor
154
24k
How To Stay Up To Date on Web Technology
chriscoyier
788
250k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
5
140
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.8k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5k
The Invisible Side of Design
smashingmag
297
50k
Speed Design
sergeychernyshev
24
560
Why You Should Never Use an ORM
jnunemaker
PRO
53
9k
Fashionably flexible responsive web design (full day workshop)
malarkey
404
65k
Automating Front-end Workflow
addyosmani
1365
200k
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