Java 8 - A Evolução da Linguagem

637 visualizações

Publicada em

Minicurso de introdução ao Java 8

Publicada em: Software
0 comentários
3 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
637
No SlideShare
0
A partir de incorporações
0
Número de incorporações
5
Ações
Compartilhamentos
0
Downloads
23
Comentários
0
Gostaram
3
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Java 8 - A Evolução da Linguagem

  1. 1. A evolução da linguagem VIII Simpósio de Informática do IFNMG Januária Prof. Ms. Petrônio Cândido
  2. 2. Agenda ● Por quê Java? ● História e evolução da linguagem Java ● Novas funcionalidades do Java 8 ● O mercado atual ● Perspectivas futuras: Java 9
  3. 3. Por quê Java? Por que sim não é resposta!
  4. 4. Por que Java??? ● Compilada em Código Intermediário (bytecode) ○ Alta portabilidade: write once, run everywhere! ● Alto Nível ● Propósito Geral ● Orientada à Objetos ● Tipagem Forte e Estática
  5. 5. Outros fatores ● Grande comunidade de desenvolvedores ● Ecossistema de frameworks, API’s, etc. ● Adoção da Indústria:
  6. 6. Outros fatores
  7. 7. Criticas ● Rígida ● Burocrática ● Conservadora
  8. 8. Criticas ● Produtividade ○ Mais funcionalidade, menos código ○ Economia de tempo ● Expressividade ○ Quantas linhas são necessárias para desenvolver uma funcionalidade simples? ○ Verborragia
  9. 9. Ninguém tem mais mercado!
  10. 10. Ninguém tem mais mercado! WEB MOBILE DESKTOP ENTERPRISE DADOS SERVIDORES JSP JSF JavaFX JME Android JavaFX JavaFXSwing EJB Hibernate JPA JDBC Tomcat JBoss Glassfish TV DIGITAL Ginga Spring VRaptor
  11. 11. História do Java E como chegamos a este ponto...
  12. 12. Evolução da Linguagem Java ● 1992 - 1994 - Primórdios do Java ○ Proprietária: Sun Microsystems ○ Oak
  13. 13. Evolução da Linguagem Java ● 1995 - Java 1.0 ○ Orientada a Objetos ○ AWT - Abstract Window Toolkit - Desktop ○ Applets - Web ○ Python 1.0
  14. 14. Processo de Compilação/Execução javac.exe Arquivo.java Arquivo.class java.exe Compilador Java Java Virtual Machine Interpretador de bytecode bytecode Arquivo fonte
  15. 15. Como era o Java original ? ● Orientação à Objetos PURA! ○ TUDO tem que estar dentro de uma classe; ○ TODA classe tem que estar dentro de um arquivo com o seu nome;
  16. 16. Como era o Java original ? ● Orientação à Objetos PURA! ○ Herança Simples ○ Polimorfismo ○ Encapsulamento ○ Interfaces ○ Classes Abstratas ○ Atributos e Métodos Estáticos ○ Pacotes ○ Modificadores de Visibilidade
  17. 17. Classes Pessoa.java public class Pessoa { private String nome; public String getNome() { return nome; } public void setNome(String n) { this.nome = n; } } Professor.java public class Professor extends Pessoa { private String siape; public String getSiape() { return siape; } public void setSiape(String n) { this.siape = n; } }
  18. 18. Como era o Java original ? ● Threads - Processos Leves ● Tratamento de Exceções
  19. 19. Interface ● Especifica um conjunto de métodos mas não os implementa; ● É um “contrato” a ser seguido por outras classes;
  20. 20. Interface Imprimivel.java public interface Imprimivel { void Imprime(); } Pessoa.java public class Pessoa implements Imprimivel { public void Imprime() { System.out.println(“Teste”); } }
  21. 21. Evolução da Linguagem Java ● 1997 - Java 1.1 ○ Inner Classes ○ JDBC - Java Database Conectivity - BD ○ RMI - Remote Method Invocation - Sist. Distribuídos ○ Reflexão ○ Servlet 1.0 - Web ○ NetBeans 1.0 - IDE
  22. 22. Evolução da Linguagem Java ● A reflexão computacional permite a invocação dinâmica de classes ○ Estático (em tempo de compilação) x Dinâmico (em tempo de execução) ○ Carregar na memória ○ Inspecionar atributos e métodos ○ Invocar métodos
  23. 23. Inner Class - Classe Interna ● Uma classe declarada dentro de outra classe; ● Uma classe auxiliar que só será utilizada dentro de outra classe; public class Externa { class Interna { … } }
  24. 24. Local Class - Classe Local ● Uma classe declarada dentro de um método, como uma variável local; ● A classe só será utilizada dentro desse método;
  25. 25. Classe Anônima ● É uma classe interna e sem nome, definida e instanciada em uma única expressão; ● Utilizado quando: ○ Criar uma implementação de uma interface ou uma classe filha que vai ser utilizada uma única vez; ○ Corpo da classe é muito curto;
  26. 26. Classe Anônima Button btn = new Button(); btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { System.out.println("Hello World!"); } });
  27. 27. Evolução da Linguagem Java ● 1998 - Java 2 ( versão 1.2 ) ○ Criado o JCP - Java Community Process ○ Collections - List, Array, Hash, ... ○ SWING - Desktop ○ J2SE - Java 2 Standard Edition ○ J2EE - Java 2 Enterprise Edition ■ EJB - Enterprise JavaBean ○ J2ME - Java 2 Micro Edition - Mobile
  28. 28. JCP - Java Community Process ● https://www.jcp.org/ ● JSR - Java Specification Request (Darcy, 2014)
  29. 29. Evolução da Linguagem Java ● 1999 - Java 2 ( versão 1.3 ) ○ Código fonte do Java 2 é aberto ○ JSP - Java Server Pages - Web ○ NetBeans 3 ○ Apache Tomcat 3.0 - Servidor Aplicações Java ○ JBoss - Servidor Aplicações Java e Java EE
  30. 30. Evolução da Linguagem Java ● 2000 - Java 2 ( versão 1.3 ) ○ JNDI - Java Naming and Directory Interface ○ Suporte ao CORBA no RMI ○ J2ME dá um salto ○ Python 2.0 ● 2001 ○ Hibernate 1.0 ○ AspectJ
  31. 31. Evolução da Linguagem Java ● 2002 - Java 2 ( versão 1.4 ) ○ Java Web Start ○ Microsoft copia o Java: .Net Framework 1.0 ■ E inova: C#
  32. 32. Evolução da Linguagem Java ● 2003 - Java 2 ( versão 1.4 ) ○ Hibernate 2.0 ○ .Net Framework 1.1 ● 2004 - Java 2 ( versão 1.4 ) ○ NetBeans 4 ○ JSF - Java Server Faces 1.0 - Web ○ Criação da Eclipse Foundation
  33. 33. Evolução da Linguagem Java ● 2005 - Java 2 ( versão 1.5) ○ Glassfish 1.0 - Servidor de Apli. Web e Java EE ○ Hibernate 3.0 ○ .Net Framework 2.0
  34. 34. Evolução da Linguagem Java ● 2005 - Java 2 ( versão 1.5) ○ Correndo atrás do C#: ■ Generics ■ Annotations ■ Enums
  35. 35. Evolução da Linguagem Java ● Generics - Tipos Genéricos ○ Tipos genéricos nos permitem criar classes com atributos cujo tipo só será conhecido no nomento da instanciação ou da herança; ○ Uma única declaração cria toda uma família de classes parametrizáveis
  36. 36. Evolução da Linguagem Java public class Ponto { private int x, y; public Ponto(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public int getY() { return y; } }
  37. 37. Evolução da Linguagem Java public class Ponto<T> { private T x, y; public Ponto(T x, T y) { this.x = x; this.y = y; } public T getX() { return x; } public T getY() { return y; } }
  38. 38. Evolução da Linguagem Java Ponto<Integer> pontoi = new Ponto<Integer>(1, 2); Ponto<Float> pontof = new Ponto<Float>(1.1, 2.75); Ponto<Double> pontod = new Ponto<Double>(1.1, 2.75); Ponto<Long> pontol = new Ponto<Long>(1, 2);
  39. 39. Evolução da Linguagem Java ● Metadados - Annotations ○ Permite colocar metadados (i.e. anotações) em classes, objetos, tipos e métodos que posteriormente podem ser recuperados via Reflexão. ○ Ajuda a “injetar” comportamentos, sem ter que invocá-los explicitamente! ○ @Annotation
  40. 40. @NotNull String nome; @Null String descricao; @Max(100) int idade; @Size(min=2, max=240) String endereco; @Past Date aniversario; Evolução da Linguagem Java
  41. 41. Evolução da Linguagem Java ● Enums - Enumerações ○ Enumerações nos ajudam a criar objetos de valor ○ São classes modificadas cujos objetos só podem assumir um conjunto finitido de constantes; public enum Sexo { Masculino, Feminino }
  42. 42. Evolução da Linguagem Java ● 2006 - Java 6 ( versão 1.6) ○ NetBeans 5.0 ○ A maior parte da linguagem e posta como Software Livre ○ JSF 1.2 ○ JPA - Java Persistence API 1.0 ■ Padronização a partir do Hibernate
  43. 43. Evolução da Linguagem Java ● 2007 - Java 6 ( versão 1.6) ○ NetBeans 6.0 ○ .Net Framework 3.5 ■ Extensão Funcionais ■ LINQ - Language Integrated Query ■ Suporte a linguagens dinâmicas
  44. 44. Evolução da Linguagem Java ● 2008 - Java 6 ( versão 1.6) ○ JavaFX 1.0 - Desenvolvimento multi-interface ○ Android 1.0 ○ Python 3.0
  45. 45. Evolução da Linguagem Java ● 2009 ○ A Oracle compra a Sun ○ JSF 2.0 ○ Android 2.0 ○ JPA 2.0 ● 2010 ○ Android 2.2 ○ Hibernate 3.0 se torna um JPA 2.0 Provider ○ .Net Framework 4.0
  46. 46. Evolução da Linguagem Java ● 2011 - Java 7 ( versão 1.7 ) ○ NetBeans 7.0 ○ Suporte a linguagens dinâmicas ○ JVM multi-linguagem ○ JSF 2.1 ○ Android 2.3 / 4.0 ○ Hibernate 4.0
  47. 47. Evolução da Linguagem Java ● 2011 - Java 7 ( versão 1.7 ) ○ Constantes string no switch ○ Catch multi classe
  48. 48. Java 8 E como chegamos a este ponto...
  49. 49. Evolução da Linguagem Java ● A versão 8 introduz na linguagem Java o Paradigma Funcional; ● O Paradigma Funcional permite que funções possam ser tratadas como variáveis, parâmetros de outras funções ou mesmo valor de retorno!
  50. 50. Evolução da Linguagem Java ● Por que Java demorou tanto? ○ Manter compatibilidade com as versões anteriores; ■ Códigos legados... ○ Processo democrático de aprovação das JSRs
  51. 51. Default Methods Métodos dentro de uma interface que já vêm com uma implementação padrão public interface Teste { void metodo1(); void metodo2(); default void metodo3() { implementação; } }
  52. 52. Interfaces Funcionais ● É qualquer interface que tenha apenas um método. ● Sempre que eu precisar de usar essa interface o compilador sabe exatamente qual método deve chamar! ● O pacote java.util.function já tem um monte de interfaces funcionais úteis!
  53. 53. Interfaces Funcionais ● java.util.function Interface Descrição Consumer<T> Aceita um parâmetro do tipo T e não produz nenhum retorno Function<T,R> Aceita um parâmetro do tipo T e produz um retorno do tipo R Predicate<T> Representa um predicado, ou seja, uma função que aceita um parâmetro do tipo T e retorna um booleano Supplier<T> Representa uma função que não tem parâmetros e produz um retorno do tipo T UnaryOperator<T> Representa um operador unário, que aceita um parâmetro do tipo T e retorna um valor do tipo T
  54. 54. Interfaces Funcionais ● java.util.function Interface Descrição Consumer<T> void consumer(T par); Function<T,R> R function(T par); Predicate<T> boolean predicate(T par) Supplier<T> T supplier() UnaryOperator<T> T unaryoperator(T par)
  55. 55. Interfaces Funcionais ● Outras Interface Descrição Comparer<T> Aceita duas entradas do tipo T retorna um inteiro (-1, 0, 1) Runnable Executa um método sem entrada e nem valor de retorno
  56. 56. Expresões Lambda ● Cria um método anônimo: (parâmetros) -> função () -> System.out.println(“Teste”) (a,b) -> a + b; (a,b) -> a > b;
  57. 57. Expresões Lambda ● Nos permitem criar variáveis que armazenam funções! Interface var = (parametros) -> função var(parametros); Predicate<Pessoa> maior = p -> p.getIdade() >= 18;
  58. 58. Method References Retornam um ponteiro para um método: Referência para um método estático Classe::metodoEstatica Referência para um método de instância objeto::metodoInstancia Contrutor Classe::new
  59. 59. Collections ● A nova API de coleções e fortemente influenciada pela LINQ do .Net ● Com ela podemos fazer operações complexas em coleções de objetos na memoria de forma simples e intuitiva; ● Ela faz uso das expressões lambda e method references;
  60. 60. Collections ● Objetivo ○ Simplificar os algoritmos que trabalham com muitos dados em memória; ○ Permitir a execução paralela de processamento de dados com facilidade;
  61. 61. Collections ● Coleção de objetos ● Computada na construção ○ Estrutura de dados na memória ● Tamanho finito
  62. 62. Collections List<Integer> inteiros = new ArrayList<>(); for(int i = 0; i < 10; i++) inteiros.add(i); for(Integer i : inteiros){ if(i % 2 == 0) { System.out.println(i); } }
  63. 63. Streams ● É uma coleção de objetos ● Computada a cada iteração ● Tamanho infinito
  64. 64. Streams Stream<Integer> inteiros = Stream.iterate(0, i <- i + 1).limit(10); inteiros .filter(i -> i % 2 == 0) .forEach(i -> System.out.println(i));
  65. 65. Streams ● Parallel Streams ○ Divide o processamento em várias threads ○ collection.parallelStream();
  66. 66. Streams Stream<Integer> inteiros = Stream.iterate(0, i <- i + 1). parallel() .limit(10); inteiros .filter(i -> i % 2 == 0) .forEach(i -> System.out.println(i));
  67. 67. Collections - Funções Intermediárias Método Descrição filter(Predicate) Seleciona itens da stream cujo predicato retorna verdadeiro map(Function) Aplica a Function em todos os elementos da Stream. O retorno da função forma os novos elementos da Stream sorted(Comparator) Ordena os elementos da Stream de acordo com o Comparator sorted() Ordena os elementos da Stream de acordo (se forem numéricos peek(Consumer) Executa uma função para cada elemento da Stream distinct() Retira todos os elementos duplicados da Stream limit(n) Seleciona os primeiros n elementos Stream skip(n) Elimina os primeiros n elementos da Stream
  68. 68. Collections - Funções Finais Método Descrição toArray() Cria uma vetor com os elementos da Stream toList() Cria uma lista com os elementos da Stream forEach(Consumer) Aplica a função Consumer em cada elemento da Stream collect(Collector) elemento da Stream reduce(BinaryOperator) elemento da Stream min(Comparator) Retorna o menor elemento (de acordo com o Comparator) da Stream max(Comparator) Retorna o maior elemento (de acordo com o Comparator) da Stream count() Retorna o número de elementos da Stream
  69. 69. Collections - Funções Finais Método Descrição anyMatch(Predicate) Retorna verdadeiro se a aplicação do Predicate for verdadeira para algum elemento da Stream allMatch(Predicate) Retorna verdadeiro se a aplicação do Predicate for verdadeira para todos os elementos da Stream noneMatch(Predicate) Retorna verdadeiro se a aplicação do Predicate for falsa para todos os elementos da Stream ifPresent(Consumer) findAny() findFirst()
  70. 70. Exemplos List<Pessoa> pessoas = new List<>(); .... pessoas .filter(u -> u.getSexo() == Sexos.Feminino && u.getIdade() > 18) .peek(System.out::println) .sorted(Comparator.comparing(Pessoa::getNome)) .map(Pessoa::getNome()) .collect(toList());
  71. 71. Exemplos int media = pessoas .filter(u -> u.getSexo() == Sexos.Feminino && u.getIdade() > 18) .mapToInt(Pessoa::getIdade()) .average(); int total = pessoas .mapToInt(Pessoa::getIdade()) .reduce(0, (a,b) -> a + b);
  72. 72. Mercado e Perspectivas Futuras
  73. 73. Evolução da Linguagem Java ● 2016 (expectativa) - Java 9 ○ Código fonte modular ○ JSON API leve ○ Cliente HTTP2 ○ Otimizações no compilador
  74. 74. Principais Concorrentes ● C# / .Net ● Python ● Ruby
  75. 75. Dúvidas???
  76. 76. Obrigado!!!
  77. 77. Referências DARCY, Joseph D. Joseph D. Darcy's Oracle Weblog: A Pictorial View of a JSR Progressing through the JCP. Disponível em <https://blogs.oracle.com/darcy/entry/pictorial_jcp>. Acesso em 20/10/2014. NETBEANS.ORG. A brief history of netbeans. Disponível em <https://netbeans.org/about/history.html>. Acesso em 10/10/2014. ORACLE. Collections Framework Enhancements in Java SE 8. Disponível em <http://docs.oracle. com/javase/8/docs/technotes/guides/collections/changes8.html > . Disponível em ORACLE. Java Timeline. Disponível em <http://oracle.com.edgesuite.net/timeline/java/>. Acesso em 06/10/2014. ORACLE. Lambda Expressions. Disponível em <http://docs.oracle. com/javase/tutorial/java/javaOO/lambdaexpressions.html>. Acesso em 22/10/2014. ORACLE. Default Methods. Disponível em <http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods. html >. acesso em 19/10/2014. ORACLE. Method References. Disponível em <http://docs.oracle. com/javase/tutorial/java/javaOO/methodreferences.html >. Disponível em 19/10/2014.
  78. 78. Referências TIOBE. TIOBE index for October 2014. Disponível em <http://www.tiobe.com/index. php/content/paperinfo/tpci/index.html >. Acesso em 22/10/2014.

×