Optional Monads com java 8

Lucas Santos

Adicionando comportamentos em OO

  • Extensão com herança
  • Composição com fields

Adicionando comportamentos em linguagens funcionais


f : X → Y 
g : Y → Z
g(f(x))
g ∘ f : X → Z
					

Problema

Manter contexto na composição das funções

Monads

Empacotando retornos de função

Estrutura da Monad

  • Tipo: M<T>
  • Unit function: T → M<T>
  • Bind function: M<T>.flatMap((T → M<U>)) = M<U>

Leis da Monad

  • Left identity

    M<T>.flatMap((T → M<U>)) == (T → M<U>).apply(T)

  • Right identity

    M<T>.flatMap(unit) == M<T>

  • Associativity

    M<T>.flatMap(F).flatMap(G)

    ==

    M<T>.flatMap(((X) → F(X).flatMap(G))

Assinaturas de função em Optional


//type constructor
public static <T> Optional<T> of(T value);
//bind
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper);
					

Talk is cheap. Show me the code!

Motivações

  • Sem saltos no fluxo como usando try catch
  • Contexto compartilhado explícito
  • Contexto imutável (side effects, replayability)

Referências