SlideShare uma empresa Scribd logo
1 de 39
Baixar para ler offline
Java 8
Stream.of(“Brito”)
.map(n -> “Rafael ” + n)
.forEach(System.out::println);
JSR 337
55 novas features
Documentação Oracle
Mas falaremos somente sobre 5 delas…
Linguagem
Lambda Expressions
Method Reference
Default Method
API
Stream
Date-Time
Segurança
JavaFX
Internacionalização
Deployment
Scripting
Pack200
IO e NIO
java.lang e java.util
Packages
Java Mission Control
JDBC
Java DB
Networking
Concorrência
HotSpot
Tools
Outras Melhorias...
Lambda
JSR 335 -> Lambda Expressions
Expressão Lambda
(parâmetros) -> {corpo}
Exemplo
(x, y) -> x + y
(int x, int y) -> {x + y;}
(a, b) -> {System.out.println(a);
System.out.println(b);}
() -> 42
(String s) -> System.out.println(s)
Por que Lambda no Java?
● 1 linha de código ao invés de 5;
● programação funcional;
● referência de métodos;
● Streams -> Filter/Map/Reduce;
● execução mais rápida que Classe Anônima;
Quase função de 1º ordem…
● pode ser passada como parâmetro;
● pode ser retornada em um método;
● pode ser armazenada em uma variável;
Por que quase?
Não existe um tipo função de verdade na JVM;
O java converte lambda em interfaces funcionais;
Antes…
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Classe Anônima");
}
}).start();
Agora…
new Thread(() ->
System.out.println("Lambda")).start();
public interface Runnable() {
public abstract void run();
}
Interfaces Funcionais
@FunctionalInterface
public interface Runnable() {
public abstract void run();
}
REGRA: apenas um método.
Unexpected @FunctionalInterface annotation
Testable is not a functional interface
@FunctionalInterface
public interface Testable() {
public boolean test();
public boolean doOtherThing();
}
Inferências
@FunctionalInterface
public interface Testable {
public boolean test(int a, int b);
}
"hum, deve retornar um
boolean".
"hum, recebe 2
parâmetros do tipo
int"
new Test().execute(2, 4, (a, b) -> a > b))
class Test {
public boolean execute(int a, int b,
Testable testable) {
return testable.test(a, b);
}
}
Criando uma Instância
Lambda
Runnable runnable = () -> System.out.println("Lambda");
Callable callable = () -> System.out.println("Lambda");
Novo Pacote: java.util.function
Predicate<T> - método com um parâmetro do tipo T e retorno do tipo boolean.
T -> boolean
Consumer<T> - método com um parâmetro do tipo T e sem retorno.
T -> {}
Function<T, R> - método com um parâmetro do tipo T e retorno do tipo R.
T -> R
Supplier<T> - método sem parâmetros e retorno do tipo T.
() -> T
BiFunction<T, R, U> - método com dois parâmetros. um do tipo T outro do tipo R e retorno do tipo U.
(T, R) -> U
Referência de Métodos
Lambda Método
x -> String.valueOf(x) String::valueOf
x -> x.toString() Object::toString
() -> new ArrayList<>() ArrayList::new
List<String> cars = Arrays.asList(“Corsa”, “Opala”, “Fusca”, “Focus”);
Collections.sort(cars, (a, b) -> a.compareTo(b));
Collections.sort(cars, String::compareTo);
System.out.println(cars);
Resultado:
[Corsa, Focus, Fusca, Opala]
4 Tipos de Method Reference
Tipo Sintaxe Exemplo
Referência a um método estático Class:staticMethodName String::valueOf
Referência a um método de uma
instância
object:instanceMethodName x::toString
Referência a um método de uma
instância arbritária qualquer, desde
que seja do tipo Class
Class::instanceMethodName String::toString
Referencia a um construtor ClassName::new String::new
Default Methods
Method Defender
Virtual Methods
Provê um mecanismo para estender uma interface
existente sem quebrar a retrocompatibilidade
java.util.List
default void replaceAll(UnaryOperator<E> operator)
default void sort(Comparator<? super E> c)
default Spliterator<E> spliterator()
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this,
Spliterator.ORDERED);
}
Um método conveniente de iterar sobre uma coleção de
maneira fluente.
Stream
JEP 107 -> Bulk and Data Structure for Collections
Stream + Lambda + Default Method
Como Fazer?
PRONTO!
Oque Fazer?
IMPLEMENTAÇÃO
Anatomia da API Stream
filter(x -> x > 3)
sorted((a, b) -> a.compareTo(b))
map(x -> x * 2)
forEach(x -> System.out.println(x))
PIPELINE
Fonte ->
{Collections,
Iterator,
Resources,
Generators}
Operação de
Finalização ->
produzem resultados
finais
Operações
Intermediárias
Criando Stream
Versão varargs
Stream.of(varargs...)
Versão Infinita
Stream.generate(Supplier<T>) -> tem o método T get()
Versão Infinita
Stream.iterate(seed, UnaryOperator<T> f) -> tem o método <T> UnaryOperator<T>identity()
Versão Strem a partir de um List
Stream<Integer> number = Arrays.asList(1, 2, 3).stream()
Versão paralela
Stream<Integer> number = Arrays.asList(1, 2, 3).parallelStream()
Tipos de Operações
Intermediárias
● Sempre retornam um novo Stream;
● Executam quantas operações encadeadas forem necessárias;
● Não inicia o pipeline de execução;
...métodos
● distinct()
● sorted()
● sorted(Comparator)
● limit(long)
● map(Function)
● filter(Predicate)
Tipos de Operações
Finalização
● Pode retornar um objeto, uma collection, ou void;
● Inicia o pipeline de execução;
● Depois de executar esta fase, o Stream, não pode ser reutilizado;
...métodos
● reduce(BinaryOperator)
● forEach(Consume)
● findFirst()
● noneMatch(Predicate)
● collect()
Collection vs Stream
Sequência de elementos Sequência de elementos
Estrutura de dados em memória Elementos percorridos uma única vez
Iteração externa Iteração interna
Tamanho finito Tamanho também pode ser infinito
Pode alterar a própria Coleção Retorna sempre um novo Stream
Iterando sobre uma Collection
● Verboso;
● Paralelismo manual;
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
List<Integer> evenNumbers = new ArrayList<>();
for (Integer number : numbers) {
if (number % 2 == 0) {
evenNumbers.add(i);
}
}
Iterando sobre um Stream
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
//versão normal
List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(toList());
//versão paralela
List<Integer> evenNumbers = numbers.parallelStream().filter(n -> n % 2 == 0).collect(toList());
● API Fluente: processo de execução encadeado;
● Execução Lazy: elementos computados somente quando necessários;
● Paralelismo Nativo com a utilização do método .parallelStream();
Guava
private void removeDuplicate(Iterable<Sale> sales) {
final Iterable<Long> inscriptionIds = transform(sales, new Function<Sale, Long>() {
@Override
public Long apply(Sale input) {
return input.getInscriptionId();
}
});
final List<Sale> existentSales = new ArrayList<Sale>();
existentSales.addAll(saleRepository.findByInscriptionIdInAndType(inscriptionIds, ORIGINAL));
removeIf(sales, new Predicate<Sale>() {
@Override
public boolean apply(final Sale sale) {
return any(existentSales, new Predicate<Sale>() {
@Override
public boolean apply(final Sale input) {
return sale.getInscriptionId().equals(input.getInscriptionId());
}
});
}
});
}
}
Stream
List<Sale> sales = Arrays.asList(new Sale(123l), new Sale(456l));
Stream<Sale> salesStream = sales.stream();
Stream<Sale> salesStream2 = sales.stream();
List<Sale> salesExistents = SaleRepository.findByInscriptionId(salesStream
.map(n -> n.getInscriptionId())
.collect(Collectors.toList()));
List<Long> inscriptionsExistents = salesExistents.stream()
.map(n -> n.getInscriptionId())
.collect(Collectors.toList());
salesStream2.filter(n -> !inscriptionsExistents.contains(n)).forEach(System.out::println);
Nova API de Datas
● Package java.time
● Baseada na biblioteca Joda-Time
● Substitui as problemáticas java.util.Date e java.util.
Calendar
● Divisão de conceitos:
○ Datas para humanos (dia, hora, mês, dia da semana…)
○ Datas para computadores (milisegundos, nanosegundos, instantes…)
Nova API de Datas
● Date
LocalDate hoje = LocalDate.now();
System.out.println(hoje); // 2014-11-07 (formato ISO-8601 yyyy-MM-dd)
LocalDate natal = LocalDate.of(2014, Month.DECEMBER, 25);
System.out.println(natal); // 2014-12-25
System.out.println(natal.getDayOfWeek().toString()); // THURSDAY (imprime por extenso)
System.out.println(natal.plusDays(7)); // 2015-01-01
● Time
LocalTime time = LocalTime.now();
System.out.println(time); // 12:01:45.382
System.out.println(time.getHour()); // 12
System.out.println(time.getSecond()); // 45
System.out.println(time.plusHours(1)); // 13:01:45.382
Nova API de Datas
● DateTime
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime); // 2014-11-07T12:01:45.382
● Timezone
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("Europe/Paris"));
System.out.println(zonedDateTime); // 2014-11-06T21:28:02.102+01:00[Europe/Paris]
OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneId.of("+07:00"));
System.out.println(offsetDateTime); // 2014-11-07T03:28:02.102+07:00]
Nova API de Datas
● Instant
Instant instant = Instant.now();
System.out.println(instant); // 2014-11-06T20:40:48.133Z
System.out.println(instant.plusMillis(100)); // 2014-11-06T20:40:48.233Z
System.out.println(instant.plusNanos(1)); // 2014-11-06T20:40:48.133000001Z
● Duration
LocalTime inicioApresentacao = LocalTime.of(11, 00);
LocalTime fimApresentacao = LocalTime.of(12, 30);
Duration duration = Duration.between(inicioApresentacao, fimApresentacao);
System.out.println(duration); // PT1H30M
System.out.println(duration.toMillis()); // 5400000
System.out.println(duration.toNanos()); // 5400000000000
Nova API de Datas
● Period
LocalDate hoje = LocalDate.now();
LocalDate natal = LocalDate.of(2014, Month.DECEMBER, 25);
Period period = Period.between(hoje, natal);
System.out.println(period); // P1M18D
● Formatando (adeus SimpleDateFormat)
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime); // 2014-11-06T18:58:20.785
System.out.println(dateTime.format(DateTimeFormatter.ofPattern("dd/MM/yy HH:mm")));
// 06/11/14 18:58
● Integração com legado
Date date = Date.from(Instant.now());
Instant instant = calendar.toInstant();
...
Livros
Referências
http://www.slideshare.net/dgomezg/streams-en-java-8
http://www.slideshare.net/martintoshev/new-features-injdk8
http://www.slideshare.net/BjrnKimminich/java-8-streams
http://www.slideshare.net/ags313/java8-new-things
http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html
Revista: Java Magazine, Edição 120 - Java 8 - Do Lambda ao Metaspace

Mais conteúdo relacionado

Mais procurados (18)

Programas auxiliares
Programas auxiliaresProgramas auxiliares
Programas auxiliares
 
Lp script pug-pe
Lp script pug-peLp script pug-pe
Lp script pug-pe
 
Introdução à linguagem c
Introdução à linguagem cIntrodução à linguagem c
Introdução à linguagem c
 
Aula 01
Aula 01Aula 01
Aula 01
 
Lambda Expressions
Lambda ExpressionsLambda Expressions
Lambda Expressions
 
12 algoritmos e funcoes recursivas
12   algoritmos e funcoes recursivas12   algoritmos e funcoes recursivas
12 algoritmos e funcoes recursivas
 
Programação funcional com java 8
Programação funcional com java 8Programação funcional com java 8
Programação funcional com java 8
 
Programação Funcional com Java 8
Programação Funcional com Java 8Programação Funcional com Java 8
Programação Funcional com Java 8
 
Lista funcões e recursividade
Lista funcões e recursividadeLista funcões e recursividade
Lista funcões e recursividade
 
App scala
App scalaApp scala
App scala
 
Pilhas e filas
Pilhas e filasPilhas e filas
Pilhas e filas
 
Canivete shell
Canivete shellCanivete shell
Canivete shell
 
Aula 10
Aula 10 Aula 10
Aula 10
 
Programação funcional
Programação funcionalProgramação funcional
Programação funcional
 
SciLab -Tutorial
SciLab -TutorialSciLab -Tutorial
SciLab -Tutorial
 
Aula 01 práticaalgoritmo laboratorio
Aula 01 práticaalgoritmo laboratorioAula 01 práticaalgoritmo laboratorio
Aula 01 práticaalgoritmo laboratorio
 
Lp m2(parte4)
Lp m2(parte4)Lp m2(parte4)
Lp m2(parte4)
 
Programação funcional no dia a dia
Programação funcional no dia a diaProgramação funcional no dia a dia
Programação funcional no dia a dia
 

Destaque

Level 3 REST Makes Your API Browsable
Level 3 REST Makes Your API BrowsableLevel 3 REST Makes Your API Browsable
Level 3 REST Makes Your API BrowsableMatt Bishop
 
Make Your API Irresistible
Make Your API IrresistibleMake Your API Irresistible
Make Your API Irresistibleduvander
 
Building RESTful applications using Spring MVC
Building RESTful applications using Spring MVCBuilding RESTful applications using Spring MVC
Building RESTful applications using Spring MVCIndicThreads
 
Spring Web Services: SOAP vs. REST
Spring Web Services: SOAP vs. RESTSpring Web Services: SOAP vs. REST
Spring Web Services: SOAP vs. RESTSam Brannen
 
REST APIs with Spring
REST APIs with SpringREST APIs with Spring
REST APIs with SpringJoshua Long
 
Microservices with Spring Boot
Microservices with Spring BootMicroservices with Spring Boot
Microservices with Spring BootJoshua Long
 
RESTful Web Services with Spring MVC
RESTful Web Services with Spring MVCRESTful Web Services with Spring MVC
RESTful Web Services with Spring MVCdigitalsonic
 
55 New Features in Java SE 8
55 New Features in Java SE 855 New Features in Java SE 8
55 New Features in Java SE 8Simon Ritter
 

Destaque (10)

Linked Data
Linked DataLinked Data
Linked Data
 
Level 3 REST Makes Your API Browsable
Level 3 REST Makes Your API BrowsableLevel 3 REST Makes Your API Browsable
Level 3 REST Makes Your API Browsable
 
Make Your API Irresistible
Make Your API IrresistibleMake Your API Irresistible
Make Your API Irresistible
 
Springboot Overview
Springboot  OverviewSpringboot  Overview
Springboot Overview
 
Building RESTful applications using Spring MVC
Building RESTful applications using Spring MVCBuilding RESTful applications using Spring MVC
Building RESTful applications using Spring MVC
 
Spring Web Services: SOAP vs. REST
Spring Web Services: SOAP vs. RESTSpring Web Services: SOAP vs. REST
Spring Web Services: SOAP vs. REST
 
REST APIs with Spring
REST APIs with SpringREST APIs with Spring
REST APIs with Spring
 
Microservices with Spring Boot
Microservices with Spring BootMicroservices with Spring Boot
Microservices with Spring Boot
 
RESTful Web Services with Spring MVC
RESTful Web Services with Spring MVCRESTful Web Services with Spring MVC
RESTful Web Services with Spring MVC
 
55 New Features in Java SE 8
55 New Features in Java SE 855 New Features in Java SE 8
55 New Features in Java SE 8
 

Semelhante a Java 8 - New Features

Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsHelder da Rocha
 
Atualização Java 8 (2014)
Atualização Java 8 (2014)Atualização Java 8 (2014)
Atualização Java 8 (2014)Helder da Rocha
 
TDC 2014 - Java 8: Expressões Lambda e API de Stream
TDC 2014 - Java 8: Expressões Lambda e API de StreamTDC 2014 - Java 8: Expressões Lambda e API de Stream
TDC 2014 - Java 8: Expressões Lambda e API de StreamDanival Calegari
 
Java 8 - Expressões Lambda e Stream API - DevCamp 2014
Java 8 - Expressões Lambda e Stream API - DevCamp 2014Java 8 - Expressões Lambda e Stream API - DevCamp 2014
Java 8 - Expressões Lambda e Stream API - DevCamp 2014Danival Calegari
 
Banco II - PostgreSQL - Funções
Banco II - PostgreSQL - FunçõesBanco II - PostgreSQL - Funções
Banco II - PostgreSQL - FunçõesGustavo Sávio
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoPaulo Morgado
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Luciano Ramalho
 
Programação funcional tipada: uma introdução
Programação funcional tipada: uma introduçãoProgramação funcional tipada: uma introdução
Programação funcional tipada: uma introduçãoArthur Xavier
 
LINQ - Language Integrated Query
LINQ - Language Integrated QueryLINQ - Language Integrated Query
LINQ - Language Integrated QueryDalton Valadares
 
Por que dizemos que Scala é uma linguagem funcional?
Por que dizemos que Scala é uma linguagem funcional?Por que dizemos que Scala é uma linguagem funcional?
Por que dizemos que Scala é uma linguagem funcional?pmatiello
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaEduardo Bregaida
 
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!Frederico Maia Arantes
 
Java orientação a objetos (variaveis de instancia e metodos)
Java   orientação a objetos (variaveis de instancia e metodos)Java   orientação a objetos (variaveis de instancia e metodos)
Java orientação a objetos (variaveis de instancia e metodos)Armando Daniel
 
[Devcamp] usando programação funcional agora!
[Devcamp] usando programação funcional agora![Devcamp] usando programação funcional agora!
[Devcamp] usando programação funcional agora!Rodrigo Stefani Domingues
 
Threads 10: CompletableFuture
Threads 10: CompletableFutureThreads 10: CompletableFuture
Threads 10: CompletableFutureHelder da Rocha
 

Semelhante a Java 8 - New Features (20)

Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e Streams
 
Atualização Java 8 (2014)
Atualização Java 8 (2014)Atualização Java 8 (2014)
Atualização Java 8 (2014)
 
TDC 2014 - Java 8: Expressões Lambda e API de Stream
TDC 2014 - Java 8: Expressões Lambda e API de StreamTDC 2014 - Java 8: Expressões Lambda e API de Stream
TDC 2014 - Java 8: Expressões Lambda e API de Stream
 
Java 8 - Expressões Lambda e Stream API - DevCamp 2014
Java 8 - Expressões Lambda e Stream API - DevCamp 2014Java 8 - Expressões Lambda e Stream API - DevCamp 2014
Java 8 - Expressões Lambda e Stream API - DevCamp 2014
 
Banco II - PostgreSQL - Funções
Banco II - PostgreSQL - FunçõesBanco II - PostgreSQL - Funções
Banco II - PostgreSQL - Funções
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPonto
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)
 
Programação funcional tipada: uma introdução
Programação funcional tipada: uma introduçãoProgramação funcional tipada: uma introdução
Programação funcional tipada: uma introdução
 
Java5
Java5Java5
Java5
 
Canivete shell
Canivete shellCanivete shell
Canivete shell
 
LINQ - Language Integrated Query
LINQ - Language Integrated QueryLINQ - Language Integrated Query
LINQ - Language Integrated Query
 
Por que dizemos que Scala é uma linguagem funcional?
Por que dizemos que Scala é uma linguagem funcional?Por que dizemos que Scala é uma linguagem funcional?
Por que dizemos que Scala é uma linguagem funcional?
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
 
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
 
Java orientação a objetos (variaveis de instancia e metodos)
Java   orientação a objetos (variaveis de instancia e metodos)Java   orientação a objetos (variaveis de instancia e metodos)
Java orientação a objetos (variaveis de instancia e metodos)
 
[Devcamp] usando programação funcional agora!
[Devcamp] usando programação funcional agora![Devcamp] usando programação funcional agora!
[Devcamp] usando programação funcional agora!
 
Mvc sem Controller
Mvc sem ControllerMvc sem Controller
Mvc sem Controller
 
Threads 10: CompletableFuture
Threads 10: CompletableFutureThreads 10: CompletableFuture
Threads 10: CompletableFuture
 
Visualg
VisualgVisualg
Visualg
 
Java8
Java8Java8
Java8
 

Java 8 - New Features

  • 1. Java 8 Stream.of(“Brito”) .map(n -> “Rafael ” + n) .forEach(System.out::println); JSR 337
  • 2. 55 novas features Documentação Oracle Mas falaremos somente sobre 5 delas… Linguagem Lambda Expressions Method Reference Default Method API Stream Date-Time
  • 3. Segurança JavaFX Internacionalização Deployment Scripting Pack200 IO e NIO java.lang e java.util Packages Java Mission Control JDBC Java DB Networking Concorrência HotSpot Tools Outras Melhorias...
  • 4. Lambda JSR 335 -> Lambda Expressions
  • 5. Expressão Lambda (parâmetros) -> {corpo} Exemplo (x, y) -> x + y
  • 6. (int x, int y) -> {x + y;} (a, b) -> {System.out.println(a); System.out.println(b);} () -> 42 (String s) -> System.out.println(s)
  • 7. Por que Lambda no Java? ● 1 linha de código ao invés de 5; ● programação funcional; ● referência de métodos; ● Streams -> Filter/Map/Reduce; ● execução mais rápida que Classe Anônima;
  • 8. Quase função de 1º ordem… ● pode ser passada como parâmetro; ● pode ser retornada em um método; ● pode ser armazenada em uma variável; Por que quase? Não existe um tipo função de verdade na JVM; O java converte lambda em interfaces funcionais;
  • 9. Antes… new Thread(new Runnable() { @Override public void run() { System.out.println("Classe Anônima"); } }).start();
  • 11. public interface Runnable() { public abstract void run(); }
  • 12. Interfaces Funcionais @FunctionalInterface public interface Runnable() { public abstract void run(); } REGRA: apenas um método.
  • 13. Unexpected @FunctionalInterface annotation Testable is not a functional interface @FunctionalInterface public interface Testable() { public boolean test(); public boolean doOtherThing(); }
  • 14. Inferências @FunctionalInterface public interface Testable { public boolean test(int a, int b); } "hum, deve retornar um boolean". "hum, recebe 2 parâmetros do tipo int" new Test().execute(2, 4, (a, b) -> a > b)) class Test { public boolean execute(int a, int b, Testable testable) { return testable.test(a, b); } }
  • 15. Criando uma Instância Lambda Runnable runnable = () -> System.out.println("Lambda"); Callable callable = () -> System.out.println("Lambda");
  • 16. Novo Pacote: java.util.function Predicate<T> - método com um parâmetro do tipo T e retorno do tipo boolean. T -> boolean Consumer<T> - método com um parâmetro do tipo T e sem retorno. T -> {} Function<T, R> - método com um parâmetro do tipo T e retorno do tipo R. T -> R Supplier<T> - método sem parâmetros e retorno do tipo T. () -> T BiFunction<T, R, U> - método com dois parâmetros. um do tipo T outro do tipo R e retorno do tipo U. (T, R) -> U
  • 17. Referência de Métodos Lambda Método x -> String.valueOf(x) String::valueOf x -> x.toString() Object::toString () -> new ArrayList<>() ArrayList::new
  • 18. List<String> cars = Arrays.asList(“Corsa”, “Opala”, “Fusca”, “Focus”); Collections.sort(cars, (a, b) -> a.compareTo(b)); Collections.sort(cars, String::compareTo); System.out.println(cars); Resultado: [Corsa, Focus, Fusca, Opala]
  • 19. 4 Tipos de Method Reference Tipo Sintaxe Exemplo Referência a um método estático Class:staticMethodName String::valueOf Referência a um método de uma instância object:instanceMethodName x::toString Referência a um método de uma instância arbritária qualquer, desde que seja do tipo Class Class::instanceMethodName String::toString Referencia a um construtor ClassName::new String::new
  • 20. Default Methods Method Defender Virtual Methods Provê um mecanismo para estender uma interface existente sem quebrar a retrocompatibilidade
  • 21. java.util.List default void replaceAll(UnaryOperator<E> operator) default void sort(Comparator<? super E> c) default Spliterator<E> spliterator() @Override default Spliterator<E> spliterator() { return Spliterators.spliterator(this, Spliterator.ORDERED); }
  • 22. Um método conveniente de iterar sobre uma coleção de maneira fluente. Stream JEP 107 -> Bulk and Data Structure for Collections
  • 23. Stream + Lambda + Default Method Como Fazer? PRONTO! Oque Fazer? IMPLEMENTAÇÃO
  • 24. Anatomia da API Stream filter(x -> x > 3) sorted((a, b) -> a.compareTo(b)) map(x -> x * 2) forEach(x -> System.out.println(x)) PIPELINE Fonte -> {Collections, Iterator, Resources, Generators} Operação de Finalização -> produzem resultados finais Operações Intermediárias
  • 25. Criando Stream Versão varargs Stream.of(varargs...) Versão Infinita Stream.generate(Supplier<T>) -> tem o método T get() Versão Infinita Stream.iterate(seed, UnaryOperator<T> f) -> tem o método <T> UnaryOperator<T>identity() Versão Strem a partir de um List Stream<Integer> number = Arrays.asList(1, 2, 3).stream() Versão paralela Stream<Integer> number = Arrays.asList(1, 2, 3).parallelStream()
  • 26. Tipos de Operações Intermediárias ● Sempre retornam um novo Stream; ● Executam quantas operações encadeadas forem necessárias; ● Não inicia o pipeline de execução; ...métodos ● distinct() ● sorted() ● sorted(Comparator) ● limit(long) ● map(Function) ● filter(Predicate)
  • 27. Tipos de Operações Finalização ● Pode retornar um objeto, uma collection, ou void; ● Inicia o pipeline de execução; ● Depois de executar esta fase, o Stream, não pode ser reutilizado; ...métodos ● reduce(BinaryOperator) ● forEach(Consume) ● findFirst() ● noneMatch(Predicate) ● collect()
  • 28. Collection vs Stream Sequência de elementos Sequência de elementos Estrutura de dados em memória Elementos percorridos uma única vez Iteração externa Iteração interna Tamanho finito Tamanho também pode ser infinito Pode alterar a própria Coleção Retorna sempre um novo Stream
  • 29. Iterando sobre uma Collection ● Verboso; ● Paralelismo manual; List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8); List<Integer> evenNumbers = new ArrayList<>(); for (Integer number : numbers) { if (number % 2 == 0) { evenNumbers.add(i); } }
  • 30. Iterando sobre um Stream List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8); //versão normal List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(toList()); //versão paralela List<Integer> evenNumbers = numbers.parallelStream().filter(n -> n % 2 == 0).collect(toList()); ● API Fluente: processo de execução encadeado; ● Execução Lazy: elementos computados somente quando necessários; ● Paralelismo Nativo com a utilização do método .parallelStream();
  • 31. Guava private void removeDuplicate(Iterable<Sale> sales) { final Iterable<Long> inscriptionIds = transform(sales, new Function<Sale, Long>() { @Override public Long apply(Sale input) { return input.getInscriptionId(); } }); final List<Sale> existentSales = new ArrayList<Sale>(); existentSales.addAll(saleRepository.findByInscriptionIdInAndType(inscriptionIds, ORIGINAL)); removeIf(sales, new Predicate<Sale>() { @Override public boolean apply(final Sale sale) { return any(existentSales, new Predicate<Sale>() { @Override public boolean apply(final Sale input) { return sale.getInscriptionId().equals(input.getInscriptionId()); } }); } }); } }
  • 32. Stream List<Sale> sales = Arrays.asList(new Sale(123l), new Sale(456l)); Stream<Sale> salesStream = sales.stream(); Stream<Sale> salesStream2 = sales.stream(); List<Sale> salesExistents = SaleRepository.findByInscriptionId(salesStream .map(n -> n.getInscriptionId()) .collect(Collectors.toList())); List<Long> inscriptionsExistents = salesExistents.stream() .map(n -> n.getInscriptionId()) .collect(Collectors.toList()); salesStream2.filter(n -> !inscriptionsExistents.contains(n)).forEach(System.out::println);
  • 33. Nova API de Datas ● Package java.time ● Baseada na biblioteca Joda-Time ● Substitui as problemáticas java.util.Date e java.util. Calendar ● Divisão de conceitos: ○ Datas para humanos (dia, hora, mês, dia da semana…) ○ Datas para computadores (milisegundos, nanosegundos, instantes…)
  • 34. Nova API de Datas ● Date LocalDate hoje = LocalDate.now(); System.out.println(hoje); // 2014-11-07 (formato ISO-8601 yyyy-MM-dd) LocalDate natal = LocalDate.of(2014, Month.DECEMBER, 25); System.out.println(natal); // 2014-12-25 System.out.println(natal.getDayOfWeek().toString()); // THURSDAY (imprime por extenso) System.out.println(natal.plusDays(7)); // 2015-01-01 ● Time LocalTime time = LocalTime.now(); System.out.println(time); // 12:01:45.382 System.out.println(time.getHour()); // 12 System.out.println(time.getSecond()); // 45 System.out.println(time.plusHours(1)); // 13:01:45.382
  • 35. Nova API de Datas ● DateTime LocalDateTime dateTime = LocalDateTime.now(); System.out.println(dateTime); // 2014-11-07T12:01:45.382 ● Timezone ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("Europe/Paris")); System.out.println(zonedDateTime); // 2014-11-06T21:28:02.102+01:00[Europe/Paris] OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneId.of("+07:00")); System.out.println(offsetDateTime); // 2014-11-07T03:28:02.102+07:00]
  • 36. Nova API de Datas ● Instant Instant instant = Instant.now(); System.out.println(instant); // 2014-11-06T20:40:48.133Z System.out.println(instant.plusMillis(100)); // 2014-11-06T20:40:48.233Z System.out.println(instant.plusNanos(1)); // 2014-11-06T20:40:48.133000001Z ● Duration LocalTime inicioApresentacao = LocalTime.of(11, 00); LocalTime fimApresentacao = LocalTime.of(12, 30); Duration duration = Duration.between(inicioApresentacao, fimApresentacao); System.out.println(duration); // PT1H30M System.out.println(duration.toMillis()); // 5400000 System.out.println(duration.toNanos()); // 5400000000000
  • 37. Nova API de Datas ● Period LocalDate hoje = LocalDate.now(); LocalDate natal = LocalDate.of(2014, Month.DECEMBER, 25); Period period = Period.between(hoje, natal); System.out.println(period); // P1M18D ● Formatando (adeus SimpleDateFormat) LocalDateTime dateTime = LocalDateTime.now(); System.out.println(dateTime); // 2014-11-06T18:58:20.785 System.out.println(dateTime.format(DateTimeFormatter.ofPattern("dd/MM/yy HH:mm"))); // 06/11/14 18:58 ● Integração com legado Date date = Date.from(Instant.now()); Instant instant = calendar.toInstant(); ...