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
900
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
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
28
2.1k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.9k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.4k
Speed Design
sergeychernyshev
25
670
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Designing for Performance
lara
604
68k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Making the Leap to Tech Lead
cromwellryan
133
9k
Building Your Own Lightsaber
phodgson
103
6.1k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
2
290
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.6k
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