28
JΛVΛSLΛNG Functional Sugar For Java

Javaslang - Functional Sugar For Java

Embed Size (px)

Citation preview

Page 1: Javaslang - Functional Sugar For Java

JΛVΛSLΛNGFunctional Sugar For Java

Page 2: Javaslang - Functional Sugar For Java

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

Functional Progamming?

Side-Effects

Referential Transparency

Thinking in Values

Page 4: Javaslang - Functional Sugar For Java

Side-Effects

Exceptions are non-local goto-statements

try { int i = 1/0; } catch (Throwable t) { … } :(

Page 5: Javaslang - Functional Sugar For Java

Referential Transparency

Math.random();

Math.max(1, 2);

Pure functions are a Good ThingTm

Side-effect :(

Page 6: Javaslang - Functional Sugar For Java

Thinking in Values

Because Rich Hickey is always right

Page 7: Javaslang - Functional Sugar For Java

A taste of JΛVΛSLΛNG!

Immutable Collections

The Try Monad

Structural Decomposition

Page 8: Javaslang - Functional Sugar For Java

Immutable Collections Image by Douglas Muth, https://flic.kr/p/acFwxG

Page 9: Javaslang - Functional Sugar For Java

Mutable Collections

Returning void is a code smell!

interface Collection<E> { … void clear(); } Side-effect :(

Page 10: Javaslang - Functional Sugar For Java

Functional Data Structures

Immutable

Persistent

Referential transparent

(and fully integrated with java.util.*)

Page 11: Javaslang - Functional Sugar For Java

List<~> t = List.of(withName(“F95”));

List<~> t2 = t.append(withName(“FCK”));

List

F95 /t

Page 12: Javaslang - Functional Sugar For Java

List<~> t = List.of(withName(“F95”));

List<~> t2 = t.append(withName(“FCK”));

List

F95 /

FCK

t

t2

Page 13: Javaslang - Functional Sugar For Java

List<~> t = List.of(withName(“F95”));

List<~> t2 = t.append(withName(“FCK”));

List

F95 /

FCK

t

t2

Page 14: Javaslang - Functional Sugar For Java

The Try Monad

Page 15: Javaslang - Functional Sugar For Java

Classic Exception Handlingtry { URL url = new URL(“http://…”); …} catch (MalformedURLException e) { … } catch (IOException e) { … }

Page 16: Javaslang - Functional Sugar For Java

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

Recovering from failure

Try.of(() -> new URL(“http://…”)) … .recover( t-> singletonList(t.getMessage()) ) .getOrElse(emptyList());

Page 18: Javaslang - Functional Sugar For Java

Structural DecompositionImage by Arend, https://flic.kr/p/pkBe4g

Page 19: Javaslang - Functional Sugar For Java

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

…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

Guard Clauses

Match(Option.of("bla")).of( Case(Some( $(v -> v.length()>4)), identity()), Case(Some($()), "other") )

Page 22: Javaslang - Functional Sugar For Java

An example from the trenches Image by Shawn Carpenter, https://flic.kr/p/7FMFjC

Page 23: Javaslang - Functional Sugar For Java

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

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

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

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

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