Slide 1

Slide 1 text

JavaϓϩάϥϚͷͨΊͷ Scalaೖ໳ Ԭຊ ༤ଠ (@okapies) 2013/03/10 (Ver 1.1) Short Edition

Slide 2

Slide 2 text

͜ͷൃද͸… ҎԼͷΑ͏ͳํ͕ର৅Ͱ͢ɻ • Java ʹΑΔιϑτ΢ΣΞ։ൃΛҰ௨Γܦݧ͍ͯ͠Δɻ • ձ࿩Ͱಥવ ”̋̋ύλʔϯ” ͱ͍͏୯ޠ͕ग़͖ͯͯ΋ɺ ڍಈෆ৹ʹͳΒͳ͍ఔ౓ͷ஌͕ࣝ͋Δɻ • ؔ਺ܕϓϩάϥϛϯάͷ࿩͸͠·ͤΜʂ

Slide 3

Slide 3 text

Short Edition? • ౰ॳ͸ɺJava ಉ౳ͷػೳ → Scala ಛ༗ͷػೳ·ͰΛ ࡾষߏ੒Ͱ঺հ͍ͯ͘͠༧ఆͩͬͨɻ • …͕ɺҰষͷ࣌఺Ͱϖʔδ਺͕ੌ͍ࣄʹͳΓஅ೦ɻ • ࠓճ͸ɺ໌೔࢖͑ΔศརػೳΛηϨΫτͯ͠͝঺հɻ

Slide 4

Slide 4 text

໨࣍ • Scala ͱ͸ʁ • case Ϋϥε • ύλʔϯϚον • ίϨΫγϣϯ • Option ܕ

Slide 5

Slide 5 text

Scalaͱ͸ʁ • Java VM ্Ͱಈ࡞͢Δϓϩάϥϛϯάݴޠɻ • 2003 ೥ʹ࠷ॳͷόʔδϣϯ͕ϦϦʔε͞Εͨɻ • ࠷৽൛͸ 2.10ʢ2013 ೥ 3 ݄ݱࡏʣɻ • εΠε࿈๜޻Պେֶϩʔβϯψߍͷ Martin Odersky ڭत͕։ൃɻ • Java 5 ͷ Generics ΍ݱߦੈ୅ͷ javac ͷ։ൃʹܞΘͬͨਓ෺ɻ • 2011 ೥ʹ Scala ͷαϙʔτ΍ίϯαϧΛߦ͏ Typesafe ࣾΛઃཱɻ

Slide 6

Slide 6 text

Scalaͷಛ௃ - 1 • ʮϚϧνύϥμΠϜʯͷ੩తܕ෇͖ݴޠ • ΦϒδΣΫτࢦ޲ϓϩάϥϛϯάͱ ؔ਺ܕϓϩάϥϛϯάͷೋͭͷύϥμΠϜΛ༥߹ɻ • རศੑ΍֦ுੑͷ޲্ͨ͠ ”Better Java” Ͱ΋͋Δɻ

Slide 7

Slide 7 text

Scalaͷಛ௃ - 2 • εέʔϥϒϧͳݴޠ (SCAlable LAnguage) • খ͞ͳεΫϦϓτ͔Βେ͖ͳγεςϜ·Ͱهड़Մɻ • υϝΠϯಛԽݴޠ (DSL) Λߏங͢ΔͨΊͷ༷ʑͳػ ೳ͕αϙʔτ͞Ε͍ͯΔɻ

Slide 8

Slide 8 text

࠾༻ࣄྫ • ΢ΣϒαʔϏε • TwitterɺLinkedInɺFoursquareɺTumblrɺυϫϯΰ • ۚ༥ɺ঎඼औҾ • UBS ۜߦɺEDF Tradingɺࡾඛ UFJ IT • NASAʢʂʣ ࠃ಺ࣄྫ΋૿Ճதʂ

Slide 9

Slide 9 text

ຊ୊ʹೖΔલʹ…

Slide 10

Slide 10 text

REPLΛ࢖͓͏ʂ • REPL: Read-Eval-Print Loop • Scala ʹඪ४Ͱ෇ଐ͢Δର࿩ܕͷ࣮ߦ؀ڥɻ • ίϯιʔϧʹଧͪࠐΜͩίʔυΛͦͷ৔Ͱ࣮ߦ͠ɺ ݁ՌΛ͔֬ΊΔ͜ͱ͕Ͱ͖Δɻ • खΛಈ͔͠ͳ͕Β Scala Λֶश͢Δͷʹ࠷దɻ

Slide 11

Slide 11 text

$ scala Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_37). Type in expressions to have them evaluated. Type :help for more information. scala> 1 + 2 res0: Int = 3 scala> println("1 + 2 = " + res0) 1 + 2 = 3 scala> :quit

Slide 12

Slide 12 text

case Ϋϥε case Ϋϥε

Slide 13

Slide 13 text

ͬͦ͘͞Ͱ͕͢… case Ϋϥε

Slide 14

Slide 14 text

Java Ͱ σʔλΫϥεΛ ࣮૷͢Δͷͬͯ ໘౗͡Όͳ͍Ͱ͔͢ʁ case Ϋϥε

Slide 15

Slide 15 text

public class Person { private String name = null; private int age = 0; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public int getAge() { return this.age; } public void setAge(int age) { this.age = age; } } Java Person - name: String - age: int case Ϋϥε

Slide 16

Slide 16 text

Կ͕໰୊͔ʁ • େྔͷ”ϘΠϥʔϓϨʔτ”ͳίʔυ • ৽͍͠ΫϥεΛ࣮૷͢ΔͨΊͷίετ͕ߴ͍ɻ • ”࣮૷ͷҙਤ”͕ຊ࣭తͰͳ͍෦෼ʹຒ΋Εͯ͠·͏ɻ Person - name: String - age: int case Ϋϥε ɾɾɾ

Slide 17

Slide 17 text

Scala Ͱ ॻ͍ͯΈΔͱ…ʁ case Ϋϥε

Slide 18

Slide 18 text

class Person(var name: String, var age: Int) Person - name: String - age: int Scala ͨͬͨҰߦʂ ˍ Ϋϥεͷҙਤ͕໌֬ʂ var/val Λ͚ͭΔ case Ϋϥε

Slide 19

Slide 19 text

class Person(var name: String, var age: Int) Scala class Person(name: String, age: Int) { def name: String = name def name_=(name: String) { this.name = name } def age: Int = age def age_=(age: Int) { this.age = age } } getter setter ίϯετϥΫλ ʹ ΞΫηα͕ࣗಈతʹఆٛ͞ΕΔ ʢຊ౰ͷ Scala ίʔυͰ͸ͳ͍͚Ͳɺงғؾ͸͜Μͳײ͡ͱ͍͏͜ͱͰʣ case Ϋϥε

Slide 20

Slide 20 text

val p = new Person(“Tom Green”, 25) println(“age: ” + p.age) // p.age() p.name = “Martin Odersky” // p.name_=(“Martin Odersky”) Scala ϑΟʔϧυͱಉ͡จ๏Ͱ ࢀরɾߋ৽Ͱ͖Δ ʢ࣮ࡍͷॲཧ͸ getter/setter Λܦ༝͢ΔͷͰ ΧϓηϧԽ͕कΒΕΔʣ case Ϋϥε

Slide 21

Slide 21 text

ͦ͏͍͑͹… case Ϋϥε

Slide 22

Slide 22 text

toString ͱ͔ equals ͱ͔ hashCode ͷ࣮૷΋ ໘౗͡Όͳ͍Ͱ͔͢ʁ case Ϋϥε

Slide 23

Slide 23 text

public class Person { private String name = null; private int age = 0; ... public boolean equals(Object obj) { if (obj == null) return false; if (obj instanceof Person) { Person rhs = (Person) obj; if (this.name == null) return rhs.name == null; return this.name.equals(rhs.name) && this.age == rhs.age; } return super.equals(obj); } public int hashCode() { return 31 * this.name.hashCode() + this.age; } public String toString() { return “Person(” + this.name + “,” + this.age + “)”; } } Java case Ϋϥε ਖ਼࣮͘͠૷͢Δͷ͸େม…

Slide 24

Slide 24 text

ͦ͜Ͱ case Ϋϥε case Ϋϥε

Slide 25

Slide 25 text

case class Person(var name: String, var age: Int) Scala એݴʹ case ͱॻ͚ͩ͘ʂ case Ϋϥε

Slide 26

Slide 26 text

case class Person(var name: String, var age: Int) val p1 = Person(“Tom Green”, 25) val p2 = Person(“Martin Odersky”, 54) p1.equals(p2) hashSet.add(p1) // depends on hashCode() println(p1.toString()) // “Person(Tom Green,25)” Scala શͯࣗಈతʹ࣮૷͞ΕΔ case Ϋϥε

Slide 27

Slide 27 text

Scala Λ࢖͏ͱ ”ܕ”Λ؆୯ʹ ఆٛͰ͖Δ case Ϋϥε

Slide 28

Slide 28 text

case Ϋϥε from https://github.com/twitter/finagle/ ྫ: memcached ͷϓϩτίϧఆٛ େྔͷܕఆ͕ٛඞཁ

Slide 29

Slide 29 text

case Ϋϥε from https://github.com/twitter/finagle/ ྫ: memcached ͷϓϩτίϧఆٛ େྔͷܕఆ͕ٛඞཁ ΫϥεΛ؆͔ܿͭݟ௨͠ྑ͘هड़Ͱ͖Δ 㱺 ”ܕͷྗ”Λ؆୯ʹҾ͖ग़ͤΔʂ

Slide 30

Slide 30 text

·ͱΊ • Scala ʹ͸σʔλΫϥε༻ͷ౶ҥߏจ͕͋Δɻ • ίϯετϥΫλ΍ getter/setter Λࣗಈతʹఆٛ͢Δ ౶ҥߏจɻ • equals() ౳Λࣗಈతʹ࣮૷͢Δ case Ϋϥεɻ • case Ϋϥεͷ͝རӹ͸ଞʹ΋ɻৄ͘͠͸ޙ΄Ͳ… case Ϋϥε

Slide 31

Slide 31 text

ύλʔϯϚον ύλʔϯϚον

Slide 32

Slide 32 text

ύλʔϯϚον ௒ڧԽ൛ switch จ ʹ ύλʔϯϚον

Slide 33

Slide 33 text

switch (ch) { case ‘ ’: buf.append(‘-’); break; case ‘¥n’: buf.append(‘:’); break; default: buf.append(ch); break; } Java •Java ͷ switch จͷෆศͳͱ͜Ζ •੔਺஋ͱจࣈྻ͔͠ൺֱͰ͖ͳ͍ɻ •ൺֱΞϧΰϦζϜ͕”Ұக”͔͠࢖͑ͳ͍ɻ ύλʔϯϚον

Slide 34

Slide 34 text

Scala ͷ match ࣜʹΑΔ ύλʔϯϚον ύλʔϯϚον

Slide 35

Slide 35 text

ch match { case ‘ ‘ => buf.append(‘-’) case ‘¥n’ => buf.append(‘:’) case _ => buf.append(ch) } Scala switch (ch) { case ‘ ’: buf.append(‘-’); break; case ‘¥n’: buf.append(‘:’); break; default: buf.append(ch); break; } Java ߏจ͸ࣅ͍ͯΔ •switch ͷ୅ΘΓʹ match Λ࢖͏ɻ •۠੾Γه߸͸ => Λ࢖͏ɻ •ϑΥʔϧεϧʔ͸͠ͳ͍ɻ break จ͸ෆཁ ύλʔϯϚον

Slide 36

Slide 36 text

match ࣜͰ͔͠ Ͱ͖ͳ͍͜ͱ ύλʔϯϚον

Slide 37

Slide 37 text

abstract class Tree case object Empty extends Tree case class Node( elem: Int, left: Tree, right: Tree) extends Tree Tree Empty - elem: Int - left: Tree - right: Tree ྫ: ೋ෼໦ Node ύλʔϯϚον

Slide 38

Slide 38 text

abstract class Tree case object Empty extends Tree case class Node( elem: Int, left: Tree, right: Tree) extends Tree def traverse(t: Tree) = t match { case empty: Empty => Nil case node: Node => traverse(node.left) ::: List(node.elem) ::: traverse(node.right) } Scala ύλʔϯϚον ஋ͷܕΛൺֱͰ͖Δ Node ͔Βதͷ஋ΛऔΓग़͢ࡍʹɺ Tree ͔Β Node ΁ͷΩϟετ͕ෆཁͳ͜ͱʹ஫໨ʂ

Slide 39

Slide 39 text

abstract class Tree case object Empty extends Tree case class Node(elem: Int, left: Tree, right: Tree) extends Tree def traverse(t: Tree) = t match { case Empty => Nil case Node(e, l, r) => traverse(l) ::: List(e) ::: traverse(r) } Scala ύλʔϯϚον த਎Λநग़Ͱ͖Δʂ ஋ͷநग़͸ case Ϋϥεͷػೳͷͻͱͭ ίϯετϥΫλͱಉ͡ه๏ʂ

Slide 40

Slide 40 text

ೖΕࢠʹͳ͍ͬͯͯ΋ ෼ղͰ͖Δ t match { case Node(e1, Node(e2, Empty, Empty), Node(e3, Empty, Empty)) => ... case ... } Scala ύλʔϯϚον e1 e2 E e3 E E E

Slide 41

Slide 41 text

case class Person(name: String, age: Int) def isAdult(p: Person) = p match { case Person(“Martin Odersky”, _) => true case Person(_, age) if (age >= 18) => true case _ => false } Scala ύλʔϯϚον ෳࡶͳ৚݅෼ذ΋ ؆ܿʹهड़Ͱ͖Δ ໊લ͕ Ұக ͨ͠Β true 18 ࡀ Ҏ্ ͳΒ true _ ͸ϫΠϧυΧʔυ

Slide 42

Slide 42 text

GoF ͷ Visitor ύλʔϯ ύλʔϯϚον

Slide 43

Slide 43 text

Visitor ύλʔϯ͸…ΞϧΰϦζϜΛΦϒδΣΫτͷߏ ଄͔Β෼཭͢ΔͨΊͷσβΠϯύλʔϯͰ͋Δɻ෼཭ ʹΑΔ࣮༻తͳ݁Ռͱͯ͠ɺطଘͷΦϒδΣΫτʹର ͢Δ৽ͨͳૢ࡞Λߏ଄Λมߋͤͣʹ௥Ճ͢Δ͜ͱ͕Ͱ ͖Δɻ from http://ja.wikipedia.org/wiki/Visitor_ύλʔϯ ύλʔϯϚον

Slide 44

Slide 44 text

class CarElementPrintVisitor implements CarElementVisitor { public void visit(Wheel wheel) { System.out.println("Visiting " + wheel.getName() + " wheel"); } public void visit(Engine engine) { System.out.println("Visiting engine"); } public void visit(Body body) { System.out.println("Visiting body"); } public void visit(Car car) { System.out.println("Visiting car"); } } class CarElementDoVisitor implements CarElementVisitor { public void visit(Wheel wheel) { System.out.println( "Kicking my " + wheel.getName() + " wheel"); } public void visit(Engine engine) { System.out.println("Starting my engine"); } public void visit(Body body) { System.out.println("Moving my body"); } public void visit(Car car) { System.out.println("Starting my car"); } } ύλʔϯϚον from http://en.wikipedia.org/wiki/Visitor_pattern ͳʹ͜Ε͜Θ͍ (ʀʉʔʉ) interface CarElementVisitor { void visit(Wheel wheel); void visit(Engine engine); void visit(Body body); void visit(Car car); } interface CarElement { void accept(CarElementVisitor visitor); } class Wheel implements CarElement { private String name; public Wheel(String name) { this.name = name; } public String getName() { return this.name; } public void accept(CarElementVisitor visitor) { visitor.visit(this); } } class Engine implements CarElement { public void accept(CarElementVisitor visitor) { visitor.visit(this); } } class Body implements CarElement { public void accept(CarElementVisitor visitor) { visitor.visit(this); } } class Car implements CarElement { CarElement[] elements; public Car() { ... } public void accept(CarElementVisitor visitor) { for(CarElement elem : elements) { elem.accept(visitor); } visitor.visit(this); } } Java

Slide 45

Slide 45 text

ύλʔϯϚονͳΒ Visitor ύλʔϯ͸ ෆཁʂ ύλʔϯϚον

Slide 46

Slide 46 text

abstract class CarElement case class Wheel(name: String) extends CarElement case object Engine extends CarElement case object Body extends CarElement case class Car(elements: List[CarElement]) extends CarElement def print(elem: CarElement) = elem match { case Wheel(name) => println(“Visiting” + name + “ wheel”) case Engine => println(“Visiting engine”) case Body => println(“Visiting body”) case Car(elements) => elements foreach print; println(“Visiting car”) } def doSomething(elem: CarElement) = elem match { case Wheel(name) => println(“Kicking my ” + name + “ wheel”) case Engine => println(“Starting my engine”) case Body => println(“Moving my body”) case Car(elements) => elements foreach doSomething; println(“Starting my car”) } Scala ύλʔϯϚον

Slide 47

Slide 47 text

·ͱΊ • ύλʔϯϚονΛ࢖͏ͱɺ ҎԼͷػೳΛಉ࣌ʹ૊Έ߹Θͤͳ͕Β؆ܿʹهड़Ͱ͖Δɻ • ৚݅෼ذʢҰகൺֱɺ͚ͩ͡Όͳ͍ʣ • ܕͷൺֱʢΩϟετෆཁʣ • த਎ͷநग़ʢcase Ϋϥεͷ͝རӹʂʣ • ύλʔϯϚον͸ Visitor ύλʔϯΛஔ͖׵͑ΒΕΔɻ ύλʔϯϚον

Slide 48

Slide 48 text

ίϨΫγϣϯ ίϨΫγϣϯ

Slide 49

Slide 49 text

Scala ඪ४ίϨΫγϣϯϥΠϒϥϦͷಛ௃ 1.ڧྗͳίϨΫγϣϯԋࢉɻ 2.ෆม(immutable)ίϨΫγϣϯɻ 3.؆୯ʹฒྻॲཧ͕Ͱ͖Δɻ ίϨΫγϣϯ

Slide 50

Slide 50 text

ίϨΫγϣϯԋࢉ ίϨΫγϣϯ

Slide 51

Slide 51 text

ૣ଎Ͱ͕͢໰୊Ͱ͢ ίϨΫγϣϯ

Slide 52

Slide 52 text

public String func(List persons) { List filtered = new ArrayList(); for (Person p : persons) { if (p.getAge() >= 18) { filtered.add(p); } } StringBuffer buf = new StringBuffer(); for (Person p : filtered) { buf.append(p.getName() + "," + p.getAge() + "\n"); } return buf.toString(); } Java Q1. ্هͷίʔυͷҙਤΛ౴͑Αɻ ʢճ౴࣌ؒ: 10 ඵɺ഑఺: 5 ఺ʣ ίϨΫγϣϯ

Slide 53

Slide 53 text

public String func(List persons) { List filtered = new ArrayList(); for (Person p : persons) { if (p.getAge() >= 18) { filtered.add(p); } } StringBuffer buf = new StringBuffer(); for (Person p : filtered) { buf.append(p.getName() + "," + p.getAge() + "\n"); } return buf.toString(); } Java Q1. ্هͷίʔυͷҙਤΛ౴͑Αɻ ʢճ౴࣌ؒ: 10 ඵɺ഑఺: 5 ఺ʣ 18 ࡀະຬͷਓΛϑΟϧλ ֤ Person Λ CSV ʹม׵ ίϨΫγϣϯ

Slide 54

Slide 54 text

΍Γ͍ͨࣄ: ίϨΫγϣϯૢ࡞ ݱ࣮: for จ & if จ஍ࠈ ίϨΫγϣϯ

Slide 55

Slide 55 text

def func(persons: List[Person]): String = persons .filter(p => p.age >= 18) .map(p => p.name + “,” + p.age) .mkString(“,”) Scala Scala ίϨΫγϣϯͳΒ ؆ܿ͞ˍಡΈ΍͕͢͞UPʂ ίϨΫγϣϯ ม׵ࡁΈϦετ͕໭Γ஋ͳͷͰ ࣍ʑͱ࿈࠯Ͱ͖Δ

Slide 56

Slide 56 text

def func(persons: List[Person]): String = persons .filter(p => p.age >= 18) .map(p => p.name + “,” + p.age) .mkString(“,”) Scala Scala ίϨΫγϣϯͳΒ ؆ܿ͞ˍಡΈ΍͕͢͞UPʂ ίϨΫγϣϯ ม׵ࡁΈϦετ͕໭Γ஋ͳͷͰ ࣍ʑͱ࿈࠯Ͱ͖Δ ͜Ε͸Կʁ

Slide 57

Slide 57 text

persons.filter(p => p.age >= 18) Scala ίʔϧόοΫΛ؆ܿʹॻ͚Δ౶ҥߏจ ͱ͍͏ཧղͰͱΓ͋͑ͣແ໰୊ͩͱࢥ͍·͢ɻ ίϨΫγϣϯ persons.filter(new Function1[Person, Boolean] { def apply(p: Person): Boolean = p.age >= 18 }) ʹ Person Λೖྗͯ͠ Boolean Λग़ྗ͢Δ p ΛҰͭͣͭ apply ʹ౉ͯ͠൑ఆ

Slide 58

Slide 58 text

ଞʹ΋ศརͳϝιου͕100Ҏ্ from http://www.ne.jp/asahi/hishidama/home/tech/scala/collection/method.html ίϨΫγϣϯ

Slide 59

Slide 59 text

Scala Ͱ͸ɺ܁Γฦ͠ॲཧͰ for ࣜΛ࢖͏ػձ͸͋·Γ͋Γ·ͤΜ 1.େ఍ͷ܁Γฦ͠ॲཧ͸ίϨΫγϣϯԋࢉΛ࢖ͬͯॻ͚Δɻ 2.ԋࢉ໊͕υΩϡϝϯτʹͳΔͷͰɺҙਤ͕໌֬ʹͳΔɻ ίϨΫγϣϯ

Slide 60

Slide 60 text

ՄมίϨΫγϣϯ ͱ ෆมίϨΫγϣϯ ίϨΫγϣϯ

Slide 61

Slide 61 text

http://docs.scala-lang.org/ja/overviews/collections/overview.html ՄมίϨΫγϣϯ •ίϨΫγϣϯ಺ͷཁૉΛมߋͰ͖Δɻ •Java ൛ͷίϨΫγϣϯ͸جຊతʹՄมɻ ίϨΫγϣϯ

Slide 62

Slide 62 text

http://docs.scala-lang.org/ja/overviews/collections/overview.html ෆมίϨΫγϣϯ •ίϨΫγϣϯ಺ͷཁૉΛมߋͰ͖ͳ͍ɻ •มߋ͍ͨ࣌͠͸৽͍͠ίϨΫγϣϯΛ࡞Δɻ ίϨΫγϣϯ

Slide 63

Slide 63 text

ෆมίϨΫγϣϯ ͬͯ ͍Βͳ͍ࢠ…ʁ ίϨΫγϣϯ

Slide 64

Slide 64 text

ҧ͏Αʂ ίϨΫγϣϯ

Slide 65

Slide 65 text

ෆม ঢ়ଶΛ࣋ͨͳ͍ ͍ͭͰ΋ɺͲ͜Ͱ΋ ಉ݁͡Ռ͕ಘΒΕΔ ʹ ίϨΫγϣϯ ʹ

Slide 66

Slide 66 text

ྫ: ςετ ଞͷϞδϡʔϧ΁౉ͨ͠ͱ͖ʹɺ ཁૉ͕มߋ͞Εͳ͍͜ͱΛอূͰ͖Δɻ Ϟδϡʔϧͷಠཱੑ͕ߴ·Γ ςετ͠΍͍͢ɻ ίϨΫγϣϯ

Slide 67

Slide 67 text

ྫ: ฒߦॲཧ ଞͷεϨου΁౉ͨ͠ͱ͖ʹɺ ཁૉ͕มߋ͞Εͳ͍͜ͱΛอূͰ͖Δ ฒߦϓϩάϥϛϯάʹىҼ͢Δ ਺ʑͷόά͔Βղ์͞ΕΔ ίϨΫγϣϯ

Slide 68

Slide 68 text

ෆมίϨΫγϣϯ Λ࢖͏ͷ͕ Scala ྲྀ ίϨΫγϣϯ ໌ࣔతʹ import ͠ͳ͍ͱෆม൛ʹͳΔ

Slide 69

Slide 69 text

ͱ͸͍ͬͯ΋ ࠷ॳ͸ ՄมίϨΫγϣϯ Ͱແ໰୊ ίϨΫγϣϯ ׳ΕͨΒෆม൛ʹ ੾Γସ͍͑ͯ͜͏

Slide 70

Slide 70 text

ฒྻίϨΫγϣϯ ίϨΫγϣϯ

Slide 71

Slide 71 text

γϯάϧίΞੑೳ޲্ͷݶք ϑϦʔϥϯν͸ऴΘͬͨʂ (ŝžŕ ίϨΫγϣϯ

Slide 72

Slide 72 text

ϚϧνίΞରԠ Ͱ ੑೳΛҾ͖ग़͍ͨ͠ ίϨΫγϣϯ

Slide 73

Slide 73 text

val ret = (1 to 10000000).map(_ + 1) Scala ී௨ͷίϨΫγϣϯԋࢉ͸ ॱ࣮࣍ߦ ίϨΫγϣϯ

Slide 74

Slide 74 text

val ret = (1 to 10000000).par.map(_ + 1) Scala ී௨ͷίϨΫγϣϯΛ ؆୯ʹ ฒྻܭࢉରԠʹͰ͖Δʂ par Λݺͼग़͚ͩ͢ʂ ίϨΫγϣϯ

Slide 75

Slide 75 text

·ͱΊ • Scala ͷڧྗͳίϨΫγϣϯԋࢉ • ίʔυͷݟ௨͠Λେ෯ʹվળɻ • ෆมίϨΫγϣϯ…࢖ͬͯ΋͍͍ͷΑʁ • ؔ਺ܕϓϩάϥϛϯά΁ͷট଴ঢ়ɻ • ϚϧνίΞΛ׆༻͢ΔฒྻॲཧԽ΋؆୯ɻ ίϨΫγϣϯ

Slide 76

Slide 76 text

Option ܕ Option ܕ

Slide 77

Slide 77 text

Option ܕ •”ࣦഊ͢Δ͔΋͠Εͳ͍ܭࢉ”Λදݱ͢Δ • ඪ४ϥΠϒϥϦͷҰ෦ (scala.Option) Option ܕ

Slide 78

Slide 78 text

I call it my billion-dollar mistake. It was the invention of the null reference in 1965. Tony Hoare (2009). “Null Reference: The Billion Dollar Mistake”. QCon London “null ͸ 10 ԯυϧͷࣦഊ” ※ʮΫΠοΫιʔτʯΛൃ໌ͨ͠ਓ Option ܕ

Slide 79

Slide 79 text

͋Γ͕ͪͳόά Person person = map.get(“tom”); println(person.getName()); Option ܕ map.get ͸ null Λฦ͔͢΋… NullPointerException!

Slide 80

Slide 80 text

null ͷ໰୊఺ •”஋͕ͳ͍ঢ়ଶ” ͱ ”ܭࢉͷࣦഊ” Λ۠ผͰ͖ͳ͍ɻ •ίϯύΠϥ͕ݕࠪͰ͖ͳ͍ͷͰɺϓϩάϥϚ͕๨Εͣ ʹ null νΣοΫΛ͠ͳ͚Ε͹ͳΒͳ͍ɻ Option ܕ

Slide 81

Slide 81 text

sealed abstract class Option[+A] final case class Some[+A](x: A) extends Option[A] object None extends Option[Nothing] Option None -x: A Some ͦ͜Ͱ Option ܕ Option ܕ ”ࣦഊͨ͠ܭࢉ”ΛදݱͰ͖Δσʔλܕ case Ϋϥεʂ

Slide 82

Slide 82 text

Option ܕΛ࢖͏ val person: Option[Person] = map.get(“tom”) person match { case Some(p) => println(p.name) case None => println(“no value!”) } ύλʔϯϚονͰ ҆શʹ஋ΛऔΓग़ͤΔ Option ܕ

Slide 83

Slide 83 text

person match { case Some(p) => println p.name // If you forget ‘case None =>’... } warning: match may not be exhaustive. It would fail on the following input: None person match { ^ ίϯύΠϥ͕ ϛεΛݟ͚ͭͯܯࠂͯ͘͠ΕΔʂ Option ܕ ͏͔ͬΓ None Λ ๨Εͯ΋… ίϯύΠϥ: ʮNone ͷఆ͕ٛແ͘ͳ͍ʁʯ

Slide 84

Slide 84 text

ίϨΫγϣϯԋࢉͱͷ૊Έ߹Θͤ person map { p => p.name // Someͷ͚࣌ͩ஋Λऔग़͠ } orElse { Some(“no value!”) // Noneͷ͚࣌ͩஔ͖׵͑Δ } foreach { name => println(name) // Someͷ͚࣌ͩग़ྗ } ώϯτ: Option ͸ཁૉ਺͕ 0 ͔ 1 ͷ List Option ܕ Ϧετͱಉ͡ϝιου…ʁ

Slide 85

Slide 85 text

Optionͷ਌ੰ • ࣦഊͨ͠ཧ༝Λอ࣋Ͱ͖Δ • Either ܕ • Try ܕʢScala 2.10 Ҏ߱ʣ • ࣦഊ͢Δ͔΋͠Εͳ͍ඇಉظܭࢉ • Future ܕʢScala 2.10 Ҏ߱ʣ Option ܕ

Slide 86

Slide 86 text

·ͱΊ • Option ܕ͸ ”ࣦഊ͢Δ͔΋͠Εͳ͍ܭࢉ” Λදݱ͢Δ • ύλʔϯϚον΍ίϨΫγϣϯԋࢉͱ૊Έ߹ΘͤΔ ͱɺܭࢉ݁ՌΛ҆શʹऔΓग़ͤΔɻ Option ܕ

Slide 87

Slide 87 text

ʢ༨ஊʣ • Option ܕ͸ ”ܕͷྗ” Λੜ͔ͨ͠ϓϩάϥϛϯάͷ޷ྫ • จ຺Λ࣋ͬͨܕʢe.g. ܭࢉͷ੒ޭɾࣦഊʣ • ίϯύΠϥ͕ɺܕΛ࢖ͬͯίʔυͷ҆શੑΛݕࠪͯ͠ ͘ΕΔɻ Option ܕ

Slide 88

Slide 88 text

શମͷ·ͱΊ • Scala ͸ ”Better Java”ɻ͜Θ͘ͳ͍Αʂ • “Better Java” ͚ͩ͡Όͳ͍ • ”ܕͷྗ”Λ׆͔ͨ҆͠શͳϓϩάϥϛϯάɻ • ͦͯؔ͠਺ܕϓϩάϥϛϯά΁…ɻ