JDK 8: Lambda, Jigsaw e novidades
                       Eder Magalhães
                         @edermag
                       www.yaw.com.br

                                        Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Agenda
        Plano B: a evolução do Java;
        As novidades do JDK 8;
        Projeto Lambda;
        Projeto Jigsaw;
        Type Annotations;
        Planejamento e datas;
        Links;




                                       Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Evolução do Java pós Oracle
        Passados 6 anos;
        Várias funcionalidades solicitadas;
        Qual planejamento para entrega?




                                              Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Evolução do Java pós Oracle
        Passados 6 anos;
        Várias funcionalidades solicitadas;
        Qual planejamento para entrega?

        A decisão foi compartilhada com a comunidade:
              Plano A:
                       JDK 7 completo com previsão para 2012;
              Plano B:
                       JDK 7 com algumas features com previsão para 2011;
                       JDK 8 com funcionalidades complementares com previsão para o
                       final de 2012;


                                                                Globalcode	
  –	
  Open4education
Saturday, July 7, 12
A escolha foi o Plano B!




                                 Globalcode	
  –	
  Open4education
Saturday, July 7, 12
As novidades do JDK 8 (JSR 338)
            Projeto Lambda: uma linguagem mais eficiente;
            Projeto Jigsaw: suporte a definição de módulos;
            Type Annotations;

            Conclusão do Projeto Coin;
            Nova API para datas no Java;




                                               Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Projeto Lambda:
                      Java funcional




                                 Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Mas afinal...
            O que é um Lambda Expression (closure)?


  Lambda expression é um bloco de código (função)
  anônimo, com declarações e expressões, que pode
  ser assinalada a uma variável.




                                            Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Motivação
            Tornar o Java mais eficiente em ambientes
            multicore;
            Emprega ao Java um modelo de programação
            funcional;
            Sintaxe mais simples e clara se comparada a
            classes anônimas;




                                             Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Projeto Lambda (JSR 335)
            Definição de funções anônimas;
            Permite criar referência a métodos;
            Interfaces com default methods;
            Estipula interfaces funcionais (SAMs);
            Mudanças nas bibliotecas do Java (Collection)
            para se adequar ao Lambda;
            Torna o código mais expressivo;




                                              Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Tarefa básica: ordernar array em Java


       String[] nomes = {"Pedro", "Carolina", "Ana", "Bruno"};


       Arrays.sort(nomes,
          new Comparator<String>() {
            public int compare(String s1, String s2) {
                return s1.compareToIgnoreCase(s2);
            }
          }
       );




                                                     Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Tarefa básica: ordernar array em Java


       String[] nomes = {"Pedro", "Carolina", "Ana", "Bruno"};


       Arrays.sort(nomes,
          new Comparator<String>() {
            public int compare(String s1, String s2) {
                return s1.compareToIgnoreCase(s2);
            }
          }
       );




                                                     Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Tarefa básica: ordernar array em Java


       String[] nomes = {"Pedro", "Carolina", "Ana", "Bruno"};


       Arrays.sort(nomes,
          (String s1, String s2) -> s1.compareToIgnoreCase(s2));




                        Lambda Expression



                                                     Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Ordenando strings com Lambda II


       String[] nomes = {"Pedro", "Carolina", "Ana", "Bruno"};


       Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2);
       Arrays.sort(nomes, c);




                        Target typing



                                                     Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Ordenando strings com Lambda III


       String[] nomes = {"Pedro", "Carolina", "Ana", "Bruno"};


       Arrays.sort(nomes, String::compareToIgnoreCase);




                         Method reference



                                                     Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Functional interfaces
            Interfaces com um método, utilizadas em
            callback;
            Conhecidas anteriormente como SAM Types.
            Exemplos:
               Comparator
               Runnable
               ActionListener
               FileFilter
               PathMatcher
               ...
                                           Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Detalhes sobre lambdas expressions
            Sintaxe também pode ser usada em return;
            Variáveis não precisam ser final;
            É possível utilizar target typing para definir
            atributos;




                                                  Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Method references
            Funcionam como expressions, a diferença é que
            não definem o corpo e sim a chamada a um
            método qualquer;

            Tipos de métodos:
              Métodos static;
              Um método específico de um determinado
              objeto;



                                             Globalcode	
  –	
  Open4education
Saturday, July 7, 12
As coleções com Lambda
            Definem uma forma mais inteligente para
            navegar sobre elementos;
            Modelo parecido com SQL!




                                              Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Navegação nos elementos

       List<Aluno> alunos = buildAlunos();

       //navegar em todos os alunos
       for (Aluno a: alunos) {
           System.out.println("t"+a);
       }




                                             Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Navegação nos elementos

       List<Aluno> alunos = buildAlunos();

       //navegar em todos os alunos
       for (Aluno a: alunos) {
           System.out.println("t"+a);
       }

       //navegar somente nos aprovados
       for (Aluno a: alunos) {
           if (a.getNota() > 5) {
               System.out.println("t"+a);
           }
       }




                                             Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Navegação nos elementos com Lambda

       List<Aluno> alunos = buildAlunos();

       //navegar em todos os alunos
       alunos.forEach(a -> { System.out.println("t" + a); });


       //navegar somente nos aprovados
       alunos.filter(a -> a.getNota() > 5)
           .forEach(a -> { System.out.println("t" + a); });




                                                     Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Interfaces: método com corpo!
            A partir de lambda será possível definir um
            comportamento default para métodos declarados
            em interfaces!




                                             Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Projeto Jigsaw:
                       Java modular




                                 Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Motivação
            Java é distribuído monoliticamente;
            O rt.jar é grande!
            Com Java 7, são quase 20k classes;
            Complexidade em lidar com legado (16 anos);




                                             Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Projeto Jigsaw
            Suporte a modularização da linguagem Java;
            Tornar o modelo de distribuição e execução do
            Java mais eficaz;




                                              Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Módulo
          É formado por um conjunto de classes e
          interfaces;
          Pode determinar uma versão;
          Pode definir um entry-point;
          Indica a dependência a outros módulos, se
          necessário;
          Restringe o acesso;
          O módulo é definido em modules-info.java;



                                             Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Exemplo de módulo


       //Arquivo modules-info.java

       module yaw.projetos @ 1.0 {
         class yaw.projetos.Main; //entry-point

           requires yaw.core @ 0.5;   //dependência

           exports yaw.projetos;      //expõe o pacote
       }




                                                         Globalcode	
  –	
  Open4education
Saturday, July 7, 12
O build
          Compilação: javac -modulepath ...
          Novos programas:
            jmod > definir biblioteca e realizar instalação
            do módulo;
            jpkg > distribuição do módulo;
          Executar: java -m <modulo>




                                                Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Vamos experimentar
          Demo I:
            compilar e executar um módulo simples;
          Demo II:
            definir relacionamento entre dois módulos;
          Demo III:
            exemplo de módulo que expõe um service;




                                             Globalcode	
  –	
  Open4education
Saturday, July 7, 12
O que mais
          Os módulos são carregados estaticamente;
          Interoperabilidade com OSGI e Maven;
          Integração com os IDEs Java;




                                           Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Type Annotations (JSR 308)

            Utilizar anotações em outros trechos do código;

            Criar um mecanismo eficiente com regras e
            validação de tipos do Java baseado em
            anotações. A evolução da idéia implementada
            com @Override;




                                               Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Type Annotations Demo
       public void execute(@NonNull Object ref) {
         //algum processamento
       }

       ...

       execute(new Object()); //ok!
       execute(null); //ñ compila!

       @NonNull Object ref = getObject();

       List<@NonNull String> nomes = ...
       nomes.add(null); //ñ compila!


       class ValorNumerico<T extends @Nullable Number> { ...}

       ValorNumerico<@Nullable Integer> v1; //ok!
       ValorNumerico<@NonNull Integer> v2; //ñ compila!


                                                     Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Planejamento de entregas
          M1: abril de 2012;
          M2: junho de 2012;
          ...
          M6: janeiro de 2013;

           GA: setembro de 2013;




                                   Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Experimente:
              http://jdk8.java.net
              http://jdk8.java.net/lambda
              http://download.java.net/jigsaw/b38/




                                        Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Código disponível em:

    https://github.com/edermag/yaw-jdk8-lambda
    https://github.com/edermag/yaw-jdk8-jigsaw




                                    Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Rumores sobre o Java 9
            VM auto ajustável (self tuning);
            Suporte a Big Data;
            Reificação dos tipos genéricos;
            Criar um protocolo de meta-objetos para
            comunicação com outras linguagens;
            Suporte a continuations;




                                              Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Links
        http://openjdk.java.net/
        http://openjdk.java.net/projects/jdk8/
        http://openjdk.java.net/projects/jigsaw/doc/
        quickstart.html
        http://openjdk.java.net/projects/lambda/
        http://www.infoq.com/br/news/2012/04/jdk-8-
        milestone-release-dates
        http://openjdk.java.net/jeps/104
        http://slideshare.net/edermag




                                            Globalcode	
  –	
  Open4education
Saturday, July 7, 12
Obrigado !

                       eder@yaw.com.br
                          @edermag




                                         Globalcode	
  –	
  Open4education
Saturday, July 7, 12

JDK8: Lambda, Jigsaw e novidades

  • 1.
    JDK 8: Lambda,Jigsaw e novidades Eder Magalhães @edermag www.yaw.com.br Globalcode  –  Open4education Saturday, July 7, 12
  • 2.
    Agenda Plano B: a evolução do Java; As novidades do JDK 8; Projeto Lambda; Projeto Jigsaw; Type Annotations; Planejamento e datas; Links; Globalcode  –  Open4education Saturday, July 7, 12
  • 3.
    Evolução do Javapós Oracle Passados 6 anos; Várias funcionalidades solicitadas; Qual planejamento para entrega? Globalcode  –  Open4education Saturday, July 7, 12
  • 4.
    Evolução do Javapós Oracle Passados 6 anos; Várias funcionalidades solicitadas; Qual planejamento para entrega? A decisão foi compartilhada com a comunidade: Plano A: JDK 7 completo com previsão para 2012; Plano B: JDK 7 com algumas features com previsão para 2011; JDK 8 com funcionalidades complementares com previsão para o final de 2012; Globalcode  –  Open4education Saturday, July 7, 12
  • 5.
    A escolha foio Plano B! Globalcode  –  Open4education Saturday, July 7, 12
  • 6.
    As novidades doJDK 8 (JSR 338) Projeto Lambda: uma linguagem mais eficiente; Projeto Jigsaw: suporte a definição de módulos; Type Annotations; Conclusão do Projeto Coin; Nova API para datas no Java; Globalcode  –  Open4education Saturday, July 7, 12
  • 7.
    Projeto Lambda: Java funcional Globalcode  –  Open4education Saturday, July 7, 12
  • 8.
    Mas afinal... O que é um Lambda Expression (closure)? Lambda expression é um bloco de código (função) anônimo, com declarações e expressões, que pode ser assinalada a uma variável. Globalcode  –  Open4education Saturday, July 7, 12
  • 9.
    Motivação Tornar o Java mais eficiente em ambientes multicore; Emprega ao Java um modelo de programação funcional; Sintaxe mais simples e clara se comparada a classes anônimas; Globalcode  –  Open4education Saturday, July 7, 12
  • 10.
    Projeto Lambda (JSR335) Definição de funções anônimas; Permite criar referência a métodos; Interfaces com default methods; Estipula interfaces funcionais (SAMs); Mudanças nas bibliotecas do Java (Collection) para se adequar ao Lambda; Torna o código mais expressivo; Globalcode  –  Open4education Saturday, July 7, 12
  • 11.
    Tarefa básica: ordernararray em Java String[] nomes = {"Pedro", "Carolina", "Ana", "Bruno"}; Arrays.sort(nomes, new Comparator<String>() { public int compare(String s1, String s2) { return s1.compareToIgnoreCase(s2); } } ); Globalcode  –  Open4education Saturday, July 7, 12
  • 12.
    Tarefa básica: ordernararray em Java String[] nomes = {"Pedro", "Carolina", "Ana", "Bruno"}; Arrays.sort(nomes, new Comparator<String>() { public int compare(String s1, String s2) { return s1.compareToIgnoreCase(s2); } } ); Globalcode  –  Open4education Saturday, July 7, 12
  • 13.
    Tarefa básica: ordernararray em Java String[] nomes = {"Pedro", "Carolina", "Ana", "Bruno"}; Arrays.sort(nomes, (String s1, String s2) -> s1.compareToIgnoreCase(s2)); Lambda Expression Globalcode  –  Open4education Saturday, July 7, 12
  • 14.
    Ordenando strings comLambda II String[] nomes = {"Pedro", "Carolina", "Ana", "Bruno"}; Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2); Arrays.sort(nomes, c); Target typing Globalcode  –  Open4education Saturday, July 7, 12
  • 15.
    Ordenando strings comLambda III String[] nomes = {"Pedro", "Carolina", "Ana", "Bruno"}; Arrays.sort(nomes, String::compareToIgnoreCase); Method reference Globalcode  –  Open4education Saturday, July 7, 12
  • 16.
    Functional interfaces Interfaces com um método, utilizadas em callback; Conhecidas anteriormente como SAM Types. Exemplos: Comparator Runnable ActionListener FileFilter PathMatcher ... Globalcode  –  Open4education Saturday, July 7, 12
  • 17.
    Detalhes sobre lambdasexpressions Sintaxe também pode ser usada em return; Variáveis não precisam ser final; É possível utilizar target typing para definir atributos; Globalcode  –  Open4education Saturday, July 7, 12
  • 18.
    Method references Funcionam como expressions, a diferença é que não definem o corpo e sim a chamada a um método qualquer; Tipos de métodos: Métodos static; Um método específico de um determinado objeto; Globalcode  –  Open4education Saturday, July 7, 12
  • 19.
    As coleções comLambda Definem uma forma mais inteligente para navegar sobre elementos; Modelo parecido com SQL! Globalcode  –  Open4education Saturday, July 7, 12
  • 20.
    Navegação nos elementos List<Aluno> alunos = buildAlunos(); //navegar em todos os alunos for (Aluno a: alunos) { System.out.println("t"+a); } Globalcode  –  Open4education Saturday, July 7, 12
  • 21.
    Navegação nos elementos List<Aluno> alunos = buildAlunos(); //navegar em todos os alunos for (Aluno a: alunos) { System.out.println("t"+a); } //navegar somente nos aprovados for (Aluno a: alunos) { if (a.getNota() > 5) { System.out.println("t"+a); } } Globalcode  –  Open4education Saturday, July 7, 12
  • 22.
    Navegação nos elementoscom Lambda List<Aluno> alunos = buildAlunos(); //navegar em todos os alunos alunos.forEach(a -> { System.out.println("t" + a); }); //navegar somente nos aprovados alunos.filter(a -> a.getNota() > 5) .forEach(a -> { System.out.println("t" + a); }); Globalcode  –  Open4education Saturday, July 7, 12
  • 23.
    Interfaces: método comcorpo! A partir de lambda será possível definir um comportamento default para métodos declarados em interfaces! Globalcode  –  Open4education Saturday, July 7, 12
  • 24.
    Projeto Jigsaw: Java modular Globalcode  –  Open4education Saturday, July 7, 12
  • 25.
    Motivação Java é distribuído monoliticamente; O rt.jar é grande! Com Java 7, são quase 20k classes; Complexidade em lidar com legado (16 anos); Globalcode  –  Open4education Saturday, July 7, 12
  • 26.
    Projeto Jigsaw Suporte a modularização da linguagem Java; Tornar o modelo de distribuição e execução do Java mais eficaz; Globalcode  –  Open4education Saturday, July 7, 12
  • 27.
    Módulo É formado por um conjunto de classes e interfaces; Pode determinar uma versão; Pode definir um entry-point; Indica a dependência a outros módulos, se necessário; Restringe o acesso; O módulo é definido em modules-info.java; Globalcode  –  Open4education Saturday, July 7, 12
  • 28.
    Exemplo de módulo //Arquivo modules-info.java module yaw.projetos @ 1.0 { class yaw.projetos.Main; //entry-point requires yaw.core @ 0.5; //dependência exports yaw.projetos; //expõe o pacote } Globalcode  –  Open4education Saturday, July 7, 12
  • 29.
    O build Compilação: javac -modulepath ... Novos programas: jmod > definir biblioteca e realizar instalação do módulo; jpkg > distribuição do módulo; Executar: java -m <modulo> Globalcode  –  Open4education Saturday, July 7, 12
  • 30.
    Vamos experimentar Demo I: compilar e executar um módulo simples; Demo II: definir relacionamento entre dois módulos; Demo III: exemplo de módulo que expõe um service; Globalcode  –  Open4education Saturday, July 7, 12
  • 31.
    O que mais Os módulos são carregados estaticamente; Interoperabilidade com OSGI e Maven; Integração com os IDEs Java; Globalcode  –  Open4education Saturday, July 7, 12
  • 32.
    Type Annotations (JSR308) Utilizar anotações em outros trechos do código; Criar um mecanismo eficiente com regras e validação de tipos do Java baseado em anotações. A evolução da idéia implementada com @Override; Globalcode  –  Open4education Saturday, July 7, 12
  • 33.
    Type Annotations Demo public void execute(@NonNull Object ref) { //algum processamento } ... execute(new Object()); //ok! execute(null); //ñ compila! @NonNull Object ref = getObject(); List<@NonNull String> nomes = ... nomes.add(null); //ñ compila! class ValorNumerico<T extends @Nullable Number> { ...} ValorNumerico<@Nullable Integer> v1; //ok! ValorNumerico<@NonNull Integer> v2; //ñ compila! Globalcode  –  Open4education Saturday, July 7, 12
  • 34.
    Planejamento de entregas M1: abril de 2012; M2: junho de 2012; ... M6: janeiro de 2013; GA: setembro de 2013; Globalcode  –  Open4education Saturday, July 7, 12
  • 35.
    Experimente: http://jdk8.java.net http://jdk8.java.net/lambda http://download.java.net/jigsaw/b38/ Globalcode  –  Open4education Saturday, July 7, 12
  • 36.
    Código disponível em: https://github.com/edermag/yaw-jdk8-lambda https://github.com/edermag/yaw-jdk8-jigsaw Globalcode  –  Open4education Saturday, July 7, 12
  • 37.
    Rumores sobre oJava 9 VM auto ajustável (self tuning); Suporte a Big Data; Reificação dos tipos genéricos; Criar um protocolo de meta-objetos para comunicação com outras linguagens; Suporte a continuations; Globalcode  –  Open4education Saturday, July 7, 12
  • 38.
    Links http://openjdk.java.net/ http://openjdk.java.net/projects/jdk8/ http://openjdk.java.net/projects/jigsaw/doc/ quickstart.html http://openjdk.java.net/projects/lambda/ http://www.infoq.com/br/news/2012/04/jdk-8- milestone-release-dates http://openjdk.java.net/jeps/104 http://slideshare.net/edermag Globalcode  –  Open4education Saturday, July 7, 12
  • 39.
    Obrigado ! eder@yaw.com.br @edermag Globalcode  –  Open4education Saturday, July 7, 12