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
Write Androidlike Scala@petitvioletFringe81 Co,. Ltd.
View Slide
About me• Hiroki Komurasaki• @petitviolet• Fringe81 Co., Ltd.• Scala: Ad server• Android (iOS): Ad SDK
What is the painof Android?
ONNOT
Nice point of Scala• first class function• `Awesome` data structures• Option, List, Either, Future, Try, …
Nice point of Scala• first class function• `Awesome` data structures• Option, List, Either, Future, Try, …• Functional Programming• Monad
Monad is• `flatMap` in Scala• `>>=` in Haskell• “すごいH本”
petitviolet/Android-Monad
Maybe
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
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); } });
Maybe• Null safe programming in Java• if (foo != null)• Maybe Monad• of, flatMap• Useful APIs• map, getOrElse, foreach, filter, …
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
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
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
Android-Monad(0.5.0)• Maybe• ListM• State• Identity
We are hiring!fringe81.com/recruit