Write Android like Scala
by
petitviolet
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Write Android like Scala @petitviolet Fringe81 Co,. Ltd.
Slide 2
Slide 2 text
About me • Hiroki Komurasaki • @petitviolet • Fringe81 Co., Ltd. • Scala: Ad server • Android (iOS): Ad SDK
Slide 3
Slide 3 text
What is the pain of Android?
Slide 4
Slide 4 text
Slide 5
Slide 5 text
Slide 6
Slide 6 text
ON NOT
Slide 7
Slide 7 text
Nice point of Scala • first class function • `Awesome` data structures • Option, List, Either, Future, Try, …
Slide 8
Slide 8 text
Nice point of Scala • first class function • `Awesome` data structures • Option, List, Either, Future, Try, … • Functional Programming • Monad
Slide 9
Slide 9 text
Monad is • `flatMap` in Scala • `>>=` in Haskell • “すごいH本”
Slide 10
Slide 10 text
petitviolet/Android-Monad
Slide 11
Slide 11 text
Maybe
Slide 12
Slide 12 text
Slide 13
Slide 13 text
Maybe itemId = Maybe.of(x); // Maybe findItemById(int id); itemId.flatMap(this::findItemById) .map(Item::getCost) .map(integer -> integer + 5) .filter(integer -> integer % 2 == 0) .foreach(integer -> { Log.d(TAG, "result: " + integer); }); Maybe
Slide 14
Slide 14 text
Maybe itemId = Maybe.of(x); // Maybe findItemById(int id); itemId.flatMap(this::findItemById) .map(Item::getCost) .map(integer -> integer + 5) .filter(integer -> integer % 2 == 0) .foreach(integer -> { Log.d(TAG, "result: " + integer); }); Maybe
Slide 15
Slide 15 text
Maybe itemId = Maybe.of(x); // Maybe findItemById(int id); itemId.flatMap(this::findItemById) .map(Item::getCost) .map(integer -> integer + 5) .filter(integer -> integer % 2 == 0) .foreach(integer -> { Log.d(TAG, "result: " + integer); }); Maybe
Slide 16
Slide 16 text
maybeInt.flatMap(new Function.F1>() { @Override public Maybe invoke(Integer integer) { return findItemById(integer); } }).map(new Function.F1() { @Override public Integer invoke(Item item) { return item.getCost(); } }).map(new Function.F1() { @Override public Integer invoke(Integer integer) { return integer + 5; } }).filter(new Function.F1() { @Override public Boolean invoke(Integer integer) { return integer % 2 == 0; } }).foreach(new Function.F() { @Override public void invoke(Integer integer) { Log.d(TAG, "result: " + integer); } });
Slide 17
Slide 17 text
Maybe • Null safe programming in Java • if (foo != null) • Maybe Monad • of, flatMap • Useful APIs • map, getOrElse, foreach, filter, …
Slide 18
Slide 18 text
ListM categoryIds = ListM.of(1, 2, 3); ListM findItemsByCId(int id); int sumCost = categoryIds .flatMap(this::findItemsByCId) .filter(item -> item.getStatus() == 1) .map(Item::getCost) .foldLeft(0, (acc, i) -> acc + i); ListM
Slide 19
Slide 19 text
ListM categoryIds = ListM.of(1, 2, 3); ListM findItemsByCId(int id); int sumCost = categoryIds .flatMap(this::findItemsByCId) .filter(item -> item.getStatus() == 1) .map(Item::getCost) .foldLeft(0, (acc, i) -> acc + i); ListM
Slide 20
Slide 20 text
ListM categoryIds = ListM.of(1, 2, 3); ListM findItemsByCId(int id); int sumCost = categoryIds .flatMap(this::findItemsByCId) .filter(item -> item.getStatus() == 1) .map(Item::getCost) .foldLeft(0, (acc, i) -> acc + i); ListM
Slide 21
Slide 21 text
ListM someViewListM = ListM.of(…); int sumOfInput = someViewListM .map(l -> ((EditText) l.findViewById(R.id.input))) .map(editText -> editText.getText().toString()) .filterNot(s -> TextUtils.isEmpty(s)) .map(Integer::parseInt) .foldLeft(0, (acc, i) -> acc + i); ListM
Slide 22
Slide 22 text
ListM someViewListM = ListM.of(…); int sumOfInput = someViewListM .map(l -> ((EditText) l.findViewById(R.id.input))) .map(editText -> editText.getText().toString()) .filterNot(s -> TextUtils.isEmpty(s)) .map(Integer::parseInt) .foldLeft(0, (acc, i) -> acc + i); ListM
Slide 23
Slide 23 text
ListM someViewListM = ListM.of(…); int sumOfInput = someViewListM .map(l -> ((EditText) l.findViewById(R.id.input))) .map(editText -> editText.getText().toString()) .filterNot(s -> TextUtils.isEmpty(s)) .map(Integer::parseInt) .foldLeft(0, (acc, i) -> acc + i); ListM
Slide 24
Slide 24 text
Slide 25
Slide 25 text
ListM • List Monad • of, unit, flatMap • for(int i = 0; i <= list.size(); i++) { // } • Useful Collection APIs • map, foreach, filter, filterNot, partition • foldLeft, foldRight, bindMaybe
Slide 26
Slide 26 text
Android-Monad(0.5.0) • Maybe • ListM • State • Identity
Slide 27
Slide 27 text
We are hiring! fringe81.com/recruit