Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Write Android like Scala

petitviolet
November 17, 2015

Write Android like Scala

Presentation in http://roppongi-aar.connpass.com/event/21907/
Write Android like Scala.
Introduction of my library Android-Monad.
Enjoy Android programming with Monadic data types!
https://github.com/petitviolet/Android-Monad

petitviolet

November 17, 2015
Tweet

More Decks by petitviolet

Other Decks in Programming

Transcript

  1. Write Android
    like Scala
    @petitviolet
    Fringe81 Co,. Ltd.

    View Slide

  2. About me
    • Hiroki Komurasaki
    • @petitviolet
    • Fringe81 Co., Ltd.
    • Scala: Ad server
    • Android (iOS): Ad SDK

    View Slide

  3. What is the pain
    of Android?

    View Slide


  4. View Slide


  5. View Slide


  6. ON
    NOT

    View Slide


  7. Nice point of Scala
    • first class function
    • `Awesome` data structures
    • Option, List, Either, Future, Try, …

    View Slide


  8. Nice point of Scala
    • first class function
    • `Awesome` data structures
    • Option, List, Either, Future, Try, …
    • Functional Programming
    • Monad

    View Slide

  9. Monad is
    • `flatMap` in Scala
    • `>>=` in Haskell
    • “すごいH本”

    View Slide

  10. petitviolet/Android-Monad

    View Slide

  11. Maybe

    View Slide


  12. View Slide



  13. 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

    View Slide



  14. 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

    View Slide



  15. 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

    View Slide


  16. 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);

    }

    });

    View Slide

  17. Maybe
    • Null safe programming in Java
    • if (foo != null)
    • Maybe Monad
    • of, flatMap
    • Useful APIs
    • map, getOrElse, foreach, filter, …

    View Slide


  18. 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

    View Slide


  19. 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

    View Slide


  20. 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

    View Slide


  21. 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

    View Slide


  22. 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

    View Slide


  23. 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

    View Slide


  24. View Slide

  25. 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

    View Slide

  26. Android-Monad(0.5.0)
    • Maybe
    • ListM
    • State
    • Identity

    View Slide

  27. We are hiring!
    fringe81.com/recruit

    View Slide