Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula...

114
Código funcional em Java: Superando o hype Eder Ignatowicz @ederign

Transcript of Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula...

Page 1: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Código funcional em Java: Superando o hype

Eder Ignatowicz @ederign

Page 2: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?
Page 3: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?
Page 4: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Lambda Expressions 101

Page 5: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Dora

Page 6: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Bento

Page 7: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

<3

Page 8: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Jesse "Pinkman"

Page 9: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

public Pug( String nome, String color, Integer size ) { this.nome = nome; this.color = color; this.weight = size; }

Pug dora = new Pug( "Dora", "abricot", 10 ); Pug bento = new Pug( "Bento", "abricot", 13 ); Pug jesse = new Pug( "Jesse", "black", 9 );

Page 10: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Requisito:

Filtrar todos os pugs de cor “abricot" da lista

Page 11: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Filtrar todos os pugs de cor “abricot" da lista

private static List<Pug> filterAbricotPugs( List<Pug> pugs ) { List<Pug> abricots = new ArrayList<>(); for ( Pug pug : pugs ) { if ( pug.getColor().equals( "abricot" ) ) { abricots.add( pug ); }

} return abricots; }

List<Pug> pugs = Arrays.asList( dora, bento, jesse );

List<Pug> abricot = filterAbricotPugs( pugs );

Pug{nome='Dora', color='abricot', weight=10} Pug{nome='Bento', color='abricot', weight=13}

Page 12: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Novo Requisito: :)

Filtrar todos os pugs de cor “black" da lista

Page 13: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

private static List<Pug> filterAbricotPugs( List<Pug> pugs ) { List<Pug> abricots = new ArrayList<>(); for ( Pug pug : pugs ) { if ( pug.getColor().equals( "abricot" ) ) { abricots.add( pug ); }

} return abricots; }

private static List<Pug> filterBlackPugs( List<Pug> pugs ) { List<Pug> abricots = new ArrayList<>(); for ( Pug pug : pugs ) { if ( pug.getColor().equals( "black" ) ) { abricots.add( pug ); }

} return abricots; }

Page 14: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Filtrar todos os pugs de cor “black" da lista private static List<Pug> filterPugByColor( List<Pug> pugs, String color ) { List<Pug> coloured = new ArrayList<>(); for ( Pug pug : pugs ) { if ( pug.getColor().equals( color ) ) { coloured.add( pug ); }

} return coloured;

}

List<Pug> black = filterPugByColor( pugs, "black" );

black.forEach( System.out::println );

Pug{nome='Jesse', color='black', weight=9}

Page 15: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Novo Requisito: :)

Filtrar todos os pugs com sobrepeso (>10 kg)

Page 16: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Filtrar todos os pugs com sobrepeso (>10 kg)

private static List<Pug> filterPugBySize( List<Pug> pugs, int size ) { List<Pug> fat = new ArrayList<>(); for ( Pug pug : pugs ) { if ( pug.getWeight() > size ) { fat.add( pug ); }

} return fat; }

List<Pug> fat = filterPugBySize( pugs, 10 );

fat.forEach( System.out::println );

Pug{nome='Bento', color='abricot', weight=13}

Page 17: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

private static List<Pug> filterPugs( List<Pug> pugs, String color, int weight, boolean flag ) { List<Pug> result = new ArrayList<>(); for ( Pug pug : pugs ) { if ( ( flag && pug.getColor().equals( color ) ) || ( !flag && pug.getWeight() > weight ) ) { result.add( pug ); }

} return result; }

Refatorador :D

Page 18: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

List<Pug> result = filterPugs(pugs, "black", 0, true); List<Pug> result1 = filterPugs(pugs, "", 10, false);

Page 19: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Behavior Parametrization

Page 20: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Behavior Parametrization public interface PugPredicate { boolean test(Pug pug); }

class BlackPugPredicate implements PugPredicate{

@Override public boolean test( Pug pug ) { return pug.getColor().equals( "black" ); } }

class FatPugPredicate implements PugPredicate{

@Override public boolean test( Pug pug ) { return pug.getWeight()>10; } }

Page 21: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Predicate

List<Pug> black = filterPug( pugs, new BlackPugPredicate() );

List<Pug> fat = filterPug( pugs, new FatPugPredicate() );

fat.forEach( System.out::println );

Pug{nome='Bento', color='abricot', weight=13}

Page 22: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Problemas?

Page 23: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Classes anônimas <3

Page 24: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

List<Pug> abricotsNotFat =

filterPug( pugs, new PugPredicate() { @Override public boolean test( Pug pug ) { return pug.getColor().equals( "abricot" ) && pug.getWeight() <= 10; } } );

abricotsNotFat.forEach( System.out::println );

Pug{nome='Dora', color='abricot', weight=10}

Page 25: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Expressões Lambda <3

Page 26: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

(Pug p1,Pug p2) -> p1.getWeight().compareTo(p2.getWeight())

Parâmetros do

Lambda

"Arrow"

Corpo do

Lambda

Page 27: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

class BlackPugPredicate implements PugPredicate{

@Override public boolean test( Pug pug ) { return "black".equals( pug.getColor() ) ); } }

blacks = filterPug( pugs, new BlackPugPredicate() );

blacks = filterPug( pugs,

(Pug pug) ->"black".equals( pug.getColor() ) );

Page 28: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Posso modificar mais um pouco?

Page 29: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

public interface Predicate<T>{ boolean test(T t);}

public static <T> List<T> filter (List<T> list, Predicate<T> p){

List<T> result = new ArrayList<>(); for(T e: list){

if(p.test(e)){ result.add(e);

} }

return result;

}

Page 30: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

List<Pug> blacks =

filter( pugs,

(Pug pug) ->"black".equals( pug.getColor() ) );

List<String> pares =

filter(numbers,

(Integer i) -> i % 2 == 0);

Predicate<Pug> fatPredicate = d -> d.getWeight() > 9; Predicate<Pug> abricotPredicate1 = d -> d.getColor().equalsIgnoreCase( "abricot" ); Predicate<Pug> abricotAndFat = abricotPredicate.and( fatPredicate );

Page 31: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

@FunctionalInterface public interface Predicate<T>{ boolean test(T t); }

public static <T> List<T> filter(List<T> list, Predicate<T> p) { List<T> results = new ArrayList<>(); for(T s: list){ if(p.test(s)){ results.add(s); } } return results; }

Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty(); List<String> nonEmpty = filter(listOfStrings, nonEmptyStringPredicate);

Predicate

Page 32: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

@FunctionalInterface public interface Function<T, R>{ R apply(T t); } public static <T, R> List<R> map(List<T> list, Function<T, R> f) { List<R> result = new ArrayList<>(); for(T s: list){ result.add(f.apply(s)); } return result; }

List<Integer> l = map(Arrays.asList("qcon","em","sampa"),

(String s) -> s.length() ); // [4, 2, 5]

Function

Page 33: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Etc. etc. etc.

BiConsumer BiFunction

BinaryOperator BiPredicate

BooleanSupplier Consumer

DoubleBinaryOperator DoubleConsumer DoubleFunction DoublePredicate DoubleSupplier

DoubleToIntFunction DoubleToLongFunction DoubleUnaryOperator

Function IntBinaryOperator

IntConsumer IntFunction IntPredicate IntSupplier

IntToDoubleFunction IntToLongFunction IntUnaryOperator

LongBinaryOperator LongConsumer LongFunction LongPredicate LongSupplier

LongToDoubleFunction LongToIntFunction

LongUnaryOperator ObjDoubleConsumer

ObjIntConsumer ObjLongConsumer

Predicate Supplier

ToDoubleBiFunction ToDoubleFunction

ToIntBiFunction ToIntFunction

ToLongBiFunction ToLongFunction UnaryOperator

Page 34: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

(Pug p1,Pug p2) -> "black".equals( pug.getColor() )

Parâmetros do

Lambda

"Arrow"

Corpo do

Lambda

Page 35: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Código funcional em Java: Superando o hype

Eder Ignatowicz

Page 36: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Streams API

Page 37: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Streams: Manipula coleções de forma declarativa

Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Page 38: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Streams: Manipula coleções de forma declarativa

SELECT nome FROM pugs WHERE weight < 9 order by peso.

Page 39: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Em JavaList<Pug> gordinhos = new ArrayList<>(); for ( Pug pug : pugs ) { if ( pug.getWeight() > 9 ) { gordinhos.add( pug ); } } Collections.sort( gordinhos, new Comparator<Pug>() { @Override public int compare( Pug p1, Pug p2 ) { return Integer.compare( p1.getWeight(), p2.getWeight() ); } });

List<String> nomeGordinhos = new ArrayList<>(); for ( Pug pug : gordinhos ) { nomeGordinhos.add( pug.getNome() ); }

Page 40: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?
Page 41: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Java 8Streams API

Page 42: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Em JavaList<String> gordinhosNome =

pugs.stream()

.filter( d -> d.getWeight() > 9 )

.sorted( comparing( Pug::getWeight ) )

.map( Pug::getNome )

.collect( toList() );

Seleciona > 9 kg

Ordena por peso

Extrai o nomeArmazena em uma lista

Page 43: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Em JavaList<Pug> gordinhos = new ArrayList<>(); for ( Pug pug : pugs ) { if ( pug.getWeight() > 9 ) { gordinhos.add( pug ); } } Collections.sort( gordinhos, new Comparator<Pug>() { @Override public int compare( Pug p1, Pug p2 ) { return Integer.compare( p1.getWeight(), p2.getWeight() ); } });

List<String> nomeGordinhos = new ArrayList<>(); for ( Pug pug : gordinhos ) { nomeGordinhos.add( pug.getNome() ); }

Page 44: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Em JavaList<String> gordinhosNome =

pugs.parallelStream()

.filter( d -> d.getWeight() > 9 )

.sorted( comparing( Pug::getWeight ) )

.map( Pug::getNome )

.collect( toList() );

Seleciona > 9 kg

Ordena por peso

Extrai o nomeArmazena em uma lista

Page 45: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

(

Page 46: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Parallel streams não são mágica!

Page 47: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

)

Page 48: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Stream Pipelines

filterpugs -> —> sorted —> map —> collect

lambda lambda lambda

Page 49: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Código: Declarativo

Componentizável Paralelizável

Streams API

Page 50: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Sequência de elementos de uma fonte que suporta operações de processamento em seus dados

Streams

Page 51: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Sequência de elementos de uma fonte que suporta operações de processamento em seus dados

Streams

Page 52: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Sequência de elementos de uma fonte que suporta operações de processamento em seus dados

Streams

Page 53: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Sequência de elementos de uma fonte que suporta operações de

processamento em seus dados

Streams

Page 54: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Streams

Uma fonte de dados para a query Uma cadeia de operações intermediárias

(pipeline) Uma operação terminal que gera o resultado

Page 55: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Vamos a prática

Page 56: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

public Venda( Vendedor vendedor, int ano, int valor ) { this.vendedor = vendedor; this.ano = ano; this.valor = valor; }

public Vendedor( String nome, String cidade ) { this.nome = nome; this.cidade = cidade; }

Page 57: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Vendedor eder = new Vendedor("Eder", "Campinas"); Vendedor pedro = new Vendedor("Pedro", "Apucarana"); Vendedor luciano = new Vendedor("Luciano", "Piracicaba"); Vendedor junior = new Vendedor("Junior", "Londrina");

List<Venda> transactions = Arrays.asList( new Venda( eder, 2014, 100 ), new Venda( eder, 2013, 200 ), new Venda( pedro, 2014, 300 ), new Venda( luciano, 2012, 500 ), new Venda( luciano, 2012, 400 ), new Venda( junior, 2012, 500 ));

Page 58: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Quais são as vendas que fizemos em 2014? Ordenadas?

Page 59: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

List<Venda> vendas2014 = transactions .stream()

Page 60: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

List<Venda> vendas2014 = transactions .stream() .filter( venda -> venda.getAno() == 2014 )

Page 61: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

List<Venda> vendas2014 = transactions .stream() .filter( venda -> venda.getAno() == 2014 ) .sorted( comparing( Venda::getValor ) )

Page 62: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

List<Venda> vendas2014 = transactions .stream() .filter( venda -> venda.getAno() == 2014 ) .sorted( comparing( Venda::getValor ) ) .collect( toList() );

Page 63: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

List<Venda> vendas2014 = transactions .stream() .filter( venda -> venda.getAno() == 2014 ) .sorted( comparing( Venda::getValor ) ) .collect( toList() );

vendas2014.forEach(System.out::println);

Venda{vendedor=Vendedor{nome='Eder', cidade='Campinas'}, ano=2014, valor=100}

Venda{vendedor=Vendedor{nome='Pedro', cidade='Apucarana'}, ano=2014, valor=300}

Page 64: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Em que cidades temos vendedores?

Page 65: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

List<String> cidadesAtendidas = vendas.stream() .map( venda -> venda.getVendedor().getCidade() ) .distinct() .collect( toList() );

Campinas Apucarana Piracicaba Londrina

Page 66: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Qual foi a maior venda?

Page 67: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Optional<Integer> maiorVenda = vendas.stream() .map(Venda::getValor) .reduce( Integer::max );

maiorVenda.ifPresent( i -> System.out.println(i));

500

Page 68: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Total de vendas?

Page 69: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Optional<Integer> totalVendas = vendas.stream() .map(Venda::getValor) .reduce( Integer::sum );

totalVendas.ifPresent( i -> System.out.println(i));

2000

Page 70: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Quais são as vendas de cada vendedor? Ordenadas?

Page 71: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Map<Vendedor, List<Venda>> vendedorPorVendas = vendas.stream() .sorted( comparing( Venda::getValor ) ) .collect( groupingBy( Venda::getVendedor ) );

System.out.println(vendedorPorVendas);

{Vendedor{nome='Junior', cidade='Londrina'}=[Venda{vendedor=Vendedor{nome='Junior', cidade='Londrina'}, ano=2012, valor=500}],

Vendedor{nome='Pedro', cidade='Apucarana'}=[Venda{vendedor=Vendedor{nome='Pedro', cidade='Apucarana'}, ano=2014, valor=300}],

Vendedor{nome='Luciano', cidade='Piracicaba'}=[Venda{vendedor=Vendedor{nome='Luciano', cidade='Piracicaba'}, ano=2012, valor=400}, Venda{vendedor=Vendedor{nome='Luciano', cidade='Piracicaba'}, ano=2012, valor=500}],

Vendedor{nome='Eder', cidade='Campinas'}=[Venda{vendedor=Vendedor{nome='Eder', cidade='Campinas'}, ano=2014, valor=100}, Venda{vendedor=Vendedor{nome='Eder', cidade='Campinas'}, ano=2013, valor=200}]}

Page 72: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?
Page 73: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?
Page 74: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?
Page 75: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Streams são lazy

Page 76: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Stream Pipelines

filterpugs -> —> map —> collect

lambda lambda

Page 77: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Stream Pipelines

intermediatepugs -> —> —> findFirst

lambda lambda

intermediate

Page 78: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Lazy Streams

List<Dog> dogs = Arrays.asList( new Dog( "Dora", true, 10, Dog.RACA.PUG ), new Dog( "Bento", true, 13, Dog.RACA.PUG ), new Dog( "Rex", false, 8, Dog.RACA.SRD ), new Dog( "Teté", false, 6, Dog.RACA.SRD ), new Dog( "Banzé", true, 7, Dog.RACA.SRD ), new Dog( "Rin-Tin-Tin", false, 15, Dog.RACA.PASTOR ) );

Page 79: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Qual o nome do primeiro SRD que pesa mais do que 5kg?

Page 80: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

String nomePrimeiroSRDMaiorDoQue5Kg = dogs.stream() .filter( dog -> { System.out.println( "filter - " + dog.getNome() ); return dog.getRaca().equals( Dog.RACA.SRD) && dog.getPeso() > 5; }) .map( dog -> { System.out.println( "map - " + dog.getNome() ); return dog.getNome(); }) .findFirst() .get();

Page 81: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Eager Streams

Dora Bento

Rex Teté

Banzé Rin Tin tin

—>SRD e

peso> 5

filter map

Rex Teté

Banzé —> Nome

"Rex" “Teté"

“Banzé" —> —> Nome

findFirst

“Rex" —>—>

Page 82: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Lazy Stream

Dora Bento

Rex Teté

Banzé Rin Tin tin

—>SRD e

peso> 5

filter map

Rex—> Nome “Rex"—> —> first()

findFirst

“Rex" —>—>

Page 83: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

String nomePrimeiroSRDMaiorDoQue5Kg = dogs.stream() .filter( dog -> { System.out.println( "filter - " + dog.getNome() ); return dog.getRaca().equals( Dog.RACA.SRD) && dog.getPeso() > 5; }) .map( dog -> { System.out.println( "map - " + dog.getNome() ); return dog.getNome(); }) .findFirst() .get();

filter - Dora filter - Bento filter - Rex map - Rex

Rex

List<Dog> dogs = Arrays.asList( new Dog( "Dora", true, 10, Dog.RACA.PUG ), new Dog( "Bento", true, 13, Dog.RACA.PUG ), new Dog( "Rex", false, 8, Dog.RACA.SRD ), new Dog( "Teté", false, 6, Dog.RACA.SRD ), new Dog( "Banzé", true, 7, Dog.RACA.SRD ), new Dog( "Rin-Tin-Tin", false, 15, Dog.RACA.PASTOR ) );

Page 84: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Streams "infinitos"

Page 85: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Criar uma lista de números primos infinita

Page 86: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

public static boolean isPrime( final int number ) { return number > 1 && IntStream.rangeClosed( 2, (int) Math.sqrt( number ) ) .noneMatch( divisor -> number % divisor == 0 ); }

public static int primeAfter( final int number ) { if ( isPrime( number + 1 ) ) { return number + 1; } else { return primeAfter( number + 1 ); } }

Page 87: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Coleções "infinitas"

Page 88: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

public static List<Integer> primes(final int fromNumber, final int count) { return Stream.iterate(primeAfter(fromNumber - 1), Primes::primeAfter) .limit(count) .collect(Collectors.<Integer>toList()); }

Page 89: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

public static List<Integer> primes(final int fromNumber, final int count) { return Stream.iterate(primeAfter(fromNumber - 1), Primes::primeAfter) .limit(count) .collect(Collectors.<Integer>toList()); }

System.out.println("10 primos do 1: " + primes( 1, 10 )); System.out.println("10 primos do 1000: " + primes( 1000, 10 ));

10 primos do 1: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] 10 primos do 1000: [1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061]

Page 90: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Recursões

Page 91: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Fibonacci

Page 92: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

public static Long fib( int n ) { if ( n < 2 ) { return new Long( n ); } else { return fib( n - 1 ) + fib( n - 2 ); } }

Page 93: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?
Page 94: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?
Page 95: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Memoization

Page 96: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Pure FunctionsIn computer programming, a function may be described as a pure function if both these statements about the function hold:

1-) The function always evaluates the same result value given the same argument value(s). The function result value cannot depend on any hidden information or state that may change as program execution proceeds or between different executions of the program, nor can it depend on any external input from I/O devices (usually—see below.

2-) Evaluation of the result does not cause any semantically observable side effect or output, such as mutation of mutable objects or output to I/O devices (usually—see below)

Page 97: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Manual

Page 98: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Integer doubleValue(Integer x) { return x * 2; }

Integer doubleValue(Integer x) { if (cache.containsKey(x)) { return cache.get(x); } else { Integer result = x * 2; cache.put(x, result) ; return result; } }

Page 99: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

private Map<Integer, Integer> cache = new ConcurrentHashMap<>();

public Integer fib(int n) { if (n == 0 || n == 1) return n;

Integer result = cache.get( n );

if (result == null) { synchronized (cache) { result = cache.get(n);

if (result == null) { result = fib(n - 2) + fib(n - 1); cache.put(n, result); } } }

return result; }

Page 100: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Java 8 to the rescue

Page 101: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

public class Fibonacci {

private Map<Integer, Integer> cache = new ConcurrentHashMap<>();

public Long fib(int n) { if (n == 0 || n == 1) return n;

return cache.computeIfAbsent(n, (k) -> fib(k - 2) + fib(k - 1)); }

}

Page 102: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

DEMO

Page 103: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Automática

Page 104: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Function<Integer, Integer> f = x -> x * 2;

Function<Integer, Integer> g = Memoizer.memoize(f);

Page 105: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

public class Memoizer {

public static <T, R> Function<T, R> memoize( Function<T, R> fn ) { Map<T, R> map = new ConcurrentHashMap<T, R>(); return ( t ) -> map.computeIfAbsent( t, fn ); }

}

Page 106: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

static Integer longCalculation(Integer x) { try { Thread.sleep(1_000); } catch (InterruptedException ignored) { } return x * 2; }

static Function<Integer, Integer> loooongCalc = Memoizer::longCalculation;

static Function<Integer, Integer> loooongCalcMemo = Memoizer.memoize(loooongCalc);

loooongCalcMemo.apply( 30 ); 1005ms

loooongCalcMemo.apply( 30 ); 0 ms

Page 107: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

static Function<Integer, Long> fibonacci = Fibonacci::calc;

static Function<Integer, Long> memoFib = Memoizer.memoize( fibonacci );

memoFib.apply( 30 ); 832040 56ms

memoFib.apply( 30 ); 832040 0 ms

Page 108: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

E agora?

Page 109: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Programar funcional em Java é uma mudança de paradigma

Page 110: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Java é multi-paradigma

Imperativo, OO e Funcional

Page 111: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Escolha o melhor deles para o seu problema

Page 112: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Java 8, Lambdas e Streams trouxeram uma nova vida

para o Java

Page 113: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

DIVIRTA-SE!

Page 114: Conferência Internacional de Desenvolvimento de Software - … · 2015. 5. 27. · Manipula coleções de forma declarativa Quais são os nomes dos Pugs com peso maior do que 9 quilos?

Obrigado!!!

@ederign