javaslang - functional sugar for java
TRANSCRIPT
![Page 1: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/1.jpg)
JΛVΛSLΛNGFunctional Sugar For Java
![Page 2: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/2.jpg)
slang (noun \ˈslaŋ\)1. language peculiar to a
particular group2. a non-standard vocabulary
composed of words and senses characterized primarily by connotations of extreme informality
![Page 3: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/3.jpg)
Functional Progamming?
Side-Effects
Referential Transparency
Thinking in Values
![Page 4: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/4.jpg)
Side-Effects
Exceptions are non-local goto-statements
try { int i = 1/0; } catch (Throwable t) { … } :(
![Page 5: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/5.jpg)
Referential Transparency
Math.random();
Math.max(1, 2);
Pure functions are a Good ThingTm
Side-effect :(
![Page 6: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/6.jpg)
Thinking in Values
Because Rich Hickey is always right
![Page 7: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/7.jpg)
A taste of JΛVΛSLΛNG!
Immutable Collections
The Try Monad
Structural Decomposition
![Page 8: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/8.jpg)
Immutable Collections Image by Douglas Muth, https://flic.kr/p/acFwxG
![Page 9: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/9.jpg)
Mutable Collections
Returning void is a code smell!
interface Collection<E> { … void clear(); } Side-effect :(
![Page 10: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/10.jpg)
Functional Data Structures
Immutable
Persistent
Referential transparent
(and fully integrated with java.util.*)
![Page 11: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/11.jpg)
List<~> t = List.of(withName(“F95”));
List<~> t2 = t.append(withName(“FCK”));
List
F95 /t
![Page 12: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/12.jpg)
List<~> t = List.of(withName(“F95”));
List<~> t2 = t.append(withName(“FCK”));
List
F95 /
FCK
t
t2
![Page 13: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/13.jpg)
List<~> t = List.of(withName(“F95”));
List<~> t2 = t.append(withName(“FCK”));
List
F95 /
FCK
t
t2
![Page 14: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/14.jpg)
The Try Monad
![Page 15: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/15.jpg)
Classic Exception Handlingtry { URL url = new URL(“http://…”); …} catch (MalformedURLException e) { … } catch (IOException e) { … }
![Page 16: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/16.jpg)
Exception Handling as a Monad
Try.of(() -> new URL(“http://…”)) .flatMap( u->Try.of(u::openConnection) ) .flatMap( c->Try.of(c::getInputStream) )…
![Page 17: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/17.jpg)
Recovering from failure
Try.of(() -> new URL(“http://…”)) … .recover( t-> singletonList(t.getMessage()) ) .getOrElse(emptyList());
![Page 18: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/18.jpg)
Structural DecompositionImage by Arend, https://flic.kr/p/pkBe4g
![Page 19: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/19.jpg)
Handling a HTTP response the classic way
if (OK.equals(res.getStatusCode())) { return exchange.getBody(); } else { return emptyList(); }
![Page 20: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/20.jpg)
…now the JΛVΛSLΛNG way
Match(res.getStatusCode()) .of( Case($OK), res.getBody()), Case(API.<HttpStatus>$(), emptyList()) );
![Page 21: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/21.jpg)
Guard Clauses
Match(Option.of("bla")).of( Case(Some( $(v -> v.length()>4)), identity()), Case(Some($()), "other") )
![Page 22: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/22.jpg)
An example from the trenches Image by Shawn Carpenter, https://flic.kr/p/7FMFjC
![Page 23: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/23.jpg)
A taste, classic stuffpublic void reset(IModel<?> model) { MyLadenModel<?, ?> myLadenModel; if (model instanceof IResettableWrapModel) { IResettableWrapModel<?> res = (IResettableWrapModel<?>) model; myLadenModel = (AbstractKontenLadenModel<?, ?>) res.getWrappedModel(); } else if (model instanceof AbstractLadenModel) { myLadenModel = (AbstractLadenModel<?, ?>) model; } else { throw new IllegalArgumentException(“Peng!”); } kontenLadenModel.reset(); }
![Page 24: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/24.jpg)
JΛVΛSLΛNG to the rescuepublic void reset(IModel<?> model) { MyLadenModel<?, ?> myLadenModel = Match(model).of( Case($(instanceOf(IResettableWrapModel.class)), res->res.getWrappedModel()), Case($(instanceOf(AbstractLadenModel.class)), identity()) );
myLadenModel.reset(); }
![Page 25: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/25.jpg)
We can’t cover everything
Collections Seq, Set, Tree…
Functional Sugar Lift, Memoize, Currying
Values Option, Lazy, Future
Extensions Circuit Breaker, Property Test
![Page 26: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/26.jpg)
But wait…what are the drawbacks?
Java’s baroque type-system
Functional Programming…use Clojure
#Collection-lib > #Logging Impl
![Page 27: Javaslang - Functional Sugar For Java](https://reader035.vdocuments.us/reader035/viewer/2022062306/58a43d5f1a28ab41618b52f9/html5/thumbnails/27.jpg)
Do you want to know more?
Javaslang Homepage
http://www.javaslang.io/javaslang-docs/
Mario Fusco, From object oriented to functional domain modeling
http://bit.ly/28Nj1Ut