Slide 1

Slide 1 text

ラムダ式を Howではなく Whyで 理解しよう! SUMIRE AOKI(JAVA子) 2023/11/11

Slide 2

Slide 2 text

Agenda • 自己紹介 • 今日の狙い • ラムダ式とは?(How) • ラムダ式はなぜできたのか(Why)

Slide 3

Slide 3 text

青木 澄怜 Aoki Sumire 職歴 :SE1年目 コミュニティ :JPIN すきなもの① :Java すきなもの② :チーズ あだ名 :Java子

Slide 4

Slide 4 text

Agenda • 自己紹介 • 今日の狙い • ラムダ式とは?(How) • ラムダ式はなぜできたのか(Why)

Slide 5

Slide 5 text

私、ラムダ式 すっごい苦手でした!!

Slide 6

Slide 6 text

Howだけ説明されても分からないんです • 例)傘を知らない人に傘を説明してみよう(How) 開けば使えます。 は…はぁ (盾か何かなのか?)

Slide 7

Slide 7 text

Howだけ説明されても分からないんです • 例)傘を知らない人に傘を説明してみよう(Why・How) なるほど~! 開けば使えます。 雨が降ったとき、 体を濡らさないための ものです。

Slide 8

Slide 8 text

Howだけ説明されても分からないんです ラムダ式もそう!!!(How) !?? ラムダ式はこう書けば 使えます! Hoge h = ()-> System.out.print(“hoge”);

Slide 9

Slide 9 text

ということでラムダ式を Whyで説明します! (ちょっとでもラムダ式って 面白いって思ってほしい!)

Slide 10

Slide 10 text

Agenda • 自己紹介 • 今日の狙い • ラムダ式とは?(How) • ラムダ式はなぜできたのか(Why)

Slide 11

Slide 11 text

関数型インタフェースをアロー演算子を使って簡潔に記述したもの。 抽象メソッドを一つしか持たないインタフェース。 ラムダ式とは(How) <基本構文> (type args, …) -> { statements } type:引数の型 args:引数の名前 statements:処理本体

Slide 12

Slide 12 text

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と表示される } }

Slide 13

Slide 13 text

Agenda • 自己紹介 • 今日の狙い • ラムダ式とは?(How) • ラムダ式はなぜできたのか(Why)

Slide 14

Slide 14 text

ラムダ式のWhyを一言で言うと 情報隠蔽の終着点

Slide 15

Slide 15 text

「何に困ってラムダ式が生まれたんだろう?」 Why

Slide 16

Slide 16 text

そもそもラムダ式が無い場合は どう書くか見ていきましょう!

Slide 17

Slide 17 text

<> CheeseInterface MozzarellaCheese User

Slide 18

Slide 18 text

そもそも インタフェースがなぜ存在するか 考えたことありますか…?

Slide 19

Slide 19 text

ラムダ式の理解には インタフェースの理解が 大前提なんです

Slide 20

Slide 20 text

インタフェースはなぜ存在するか 使う側への思いやり

Slide 21

Slide 21 text

インタフェース・・・規約、ルール(扱い方)を定めたもの イメージ例)スマホの充電器

Slide 22

Slide 22 text

インタフェースが無いとどうなるか? iPhone8 iPhoneX iPhone8用 iPhoneX用・・・

Slide 23

Slide 23 text

「iPhoneの充電器は これ!!」 iPhone8 iPhoneX どのiPhoneでも 同じ充電器で良くなる!!

Slide 24

Slide 24 text

Javaのコードで言うと? User MozzarellaCheese CamembertCheese

Slide 25

Slide 25 text

Javaのコードで言うと? public class User { public static void main(String[] args) { //モッツァレラチーズの仕様の場合 MozzarellaCheese m = new MozzarellaCheese(); //カマンベールチーズの仕様の場合 CamembertCheese c = new CamembertCheese(); いちいち型(扱い方)を変えないといけなくて面倒…

Slide 26

Slide 26 text

Cheeseインタフェースを用意してみましょう! User MozzarellaCheese CamembertCheese

Slide 27

Slide 27 text

<> CheeseInterface User MozzarellaCheese CamembertCheese Cheeseインタフェースを用意しましょう!

Slide 28

Slide 28 text

型を気にしなくてよくなりました!

Slide 29

Slide 29 text

インタフェースはなぜ存在するか 使う側への思いやり

Slide 30

Slide 30 text

実装クラスや変更を見せる必要無いですよね… こんな時使える 便利なデザインパターンが あるんです!!

Slide 31

Slide 31 text

オブジェクト生成を専門に担当するクラスを導入することで、 使う側のクラスが生成のプロセス(変更)を意識する必要が無くなる設計。 Factoryデザインパターン Factory User A B

Slide 32

Slide 32 text

今回のコードに当てはめると・・・ <> CheeseInterface User MozzarellaCheese CamembertCheese

Slide 33

Slide 33 text

こんな感じ <> CheeseInterface User MozzarellaCheese CamembertCheese Factory

Slide 34

Slide 34 text

Factoryクラスを作る前 User mozzarellaChees e

Slide 35

Slide 35 text

Factoryクラス作成後 User mozzarellaChees e CamembertCheese 使う側のクラスから変更を何も意識しなくてよくなった!!

Slide 36

Slide 36 text

これでクライアントとオブジェクトの具体的な実装を 分離することができました!

Slide 37

Slide 37 text

大変お待たせしました ここからラムダ式の話します (遅い)

Slide 38

Slide 38 text

「このMozzarellaCheeseクラス、危険だな」

Slide 39

Slide 39 text

何かのクラス 別のクラス Factoryクラス以外から アクセスできないように してしまいたい

Slide 40

Slide 40 text

「これをいっそのこと・・・」

Slide 41

Slide 41 text

「Factoryクラスに隠しちゃえ!」 ※インナークラス ※privateなインナークラス

Slide 42

Slide 42 text

「これで他からアクセスできない!」 何かのクラス 別のクラス ※privateなインナークラス

Slide 43

Slide 43 text

public class Factory { public static CheeseInterface create() { return new MozzarellaCheese(); } private static class MozzarellaCheese implements CheeseInterface{ @Override public void desc() { System.out.println("mozzarellaCheese"); } } }

Slide 44

Slide 44 text

「このクラスcreateメソッドからしか 使われてないなぁ…」 Factoryクラス createメソッド MozzarellaCheeseクラス(インナークラス)

Slide 45

Slide 45 text

「複数のメソッドから使われてる わけでもないし・・・」 Factoryクラス createメソッド MozzarellaCheeseクラス(インナークラス) 他のメソッド

Slide 46

Slide 46 text

「createメソッドに隠しちゃえ!」 Factoryクラス createメソッド MozzarellaCheeseクラス(インナークラス)

Slide 47

Slide 47 text

Factoryクラス createメソッド MozzarellaCheeseクラス 「createメソッドに隠しちゃえ!」 ※ローカルクラス

Slide 48

Slide 48 text

コードで書くとこんな感じです ※ローカルクラス

Slide 49

Slide 49 text

「ここでしか使わないならクラスの名前つける必要ないな・・・」

Slide 50

Slide 50 text

「名無しで処理だけ定義しちゃえ!」 ※匿名クラス

Slide 51

Slide 51 text

匿名クラスとは・・・新しくクラスを作成せずに インタフェース(抽象クラス)を実装できるもの インタフェース 実装クラス 使う側のクラス インタフェース 使う側のクラス <匿名クラス> <従来の実装方法> ※インタフェース(抽象クラス) のメソッド数に制限はありません

Slide 52

Slide 52 text

インナークラスから匿名クラスの コードの変化を 見てみましょう!

Slide 53

Slide 53 text

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メソッドに隠したいな」

Slide 54

Slide 54 text

public class Factory { public static CheeseInterface create() { class MozzarellaCheese implements CheeseInterface{ @Override public void desc() { System.out.println("mozzarellaCheese"); } } return new MozzarellaCheese(); } } ローカルクラス 「クラスの名前つける必要ないな」

Slide 55

Slide 55 text

public class Factory { public static CheeseInterface create() { class MozzarellaCheese implements CheeseInterface{ @Override public void desc() { System.out.println("mozzarellaCheese"); } } return c; } } ローカルクラス

Slide 56

Slide 56 text

public class Factory { public static CheeseInterface create() { CheeseInterface c = new CheeseInterface() { @Override public void desc() { System.out.println("mozzarellaCheese"); } }; return c; } } 匿名クラス

Slide 57

Slide 57 text

「あー、かなりコードがすっきりした! …いや、待てよ?」 public class Factory { public static CheeseInterface create() { CheeseInterface c = new CheeseInterface() { @Override public void desc() { System.out.println("mozzarellaCheese"); } }; return new MozzarellaCheese(); } }

Slide 58

Slide 58 text

「インタフェースの メソッドが一つなら、 もっと省略出来るのでは…?」

Slide 59

Slide 59 text

public interface CheeseInterface { public void desc(); } CheeseInterface c = new CheeseInterface() { @Override public void desc() { System.out.println("mozzarellaCheese"); } }; ←インタフェース ↓匿名クラス

Slide 60

Slide 60 text

public interface CheeseInterface { public void desc(); } CheeseInterface c = new CheeseInterface() { @Override public void desc() { System.out.println("mozzarellaCheese"); } }; ←インタフェース ↓匿名クラス

Slide 61

Slide 61 text

public interface CheeseInterface { public void desc(); } CheeseInterface c = new CheeseInterface() { @Override public void desc() { System.out.println("mozzarellaCheese"); } }; ←インタフェース ↓匿名クラス

Slide 62

Slide 62 text

お待たせしました!ラムダ式の登場です!

Slide 63

Slide 63 text

ラムダ式のWhyを一言で言うと 情報隠蔽の終着点

Slide 64

Slide 64 text

Whyから理解することで ラムダ式のイメージは 変わりましたか?

Slide 65

Slide 65 text

Whyを理解した今だからこそ、 Howを知りたくなりませんか?

Slide 66

Slide 66 text

ありがとうございました X @Sumirecheese