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