SlideShare uma empresa Scribd logo
1 de 21
Baixar para ler offline
Usando Java 8 no
Android
Eduardo Bonet
Motivação
Java 8 foi lançado há mais de 2 anos, trazendo diversas novidades, mas
que não chegaram ao Android.
A nova toolchain (Jack & Jill) trouxe um suporte limitado de algumas
features, porém deixou outras de fora e algumas são suportadas apenas
de Android N para frente.
Java 8
Redução de verbosidade
Novas API's:
java.time.*
java.util.stream.*
java.util.function.*
Mudanças na linguagem:
Default Methods e métodos estáticos para Interfaces
Lambda
Method References
Streams
API melhorada para manuseio de coleções, facilitando execução paralela
// Java 7
names = new ArrayList<>();
for (Person p : people) {
if(p.age > 16)
names.add(p.name);
}
// Java 8
names = people.stream()
.filter(p -> p.age > 16)
.map(p -> p.name)
.collect(Collectors.toList());
Time API
Nova API para lidar com data e hora, substituindo as classes
java.util.Calendar e java.util.Date.
// Java7
Date date, datePlusThreeDays;
date = new GregorianCalendar(2014, Calendar.FEBRUARY, 11).getTime()
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, 3)
datePlusThreeDays = c.getTime()
// Java 8
LocalDate otherDate, otherDatePlusThreeDays;
otherDate = LocalDate.of(2014, Month.FEBRUARY, 11);
otherDatePlusThreeDays = otherDate.plus(3, ChronoUnit.DAYS);
Lambdas
Lambdas fornecem uma sintaxe muito mais limpa para Functors.
// Java 7
v.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) {
Log.d(TAG, "onClick: ");
}
});
// Java 8 Lambda
v.setOnClickListener(view -> Log.d(TAG, "onClick: "));
Observable.from(people)
.filter(new Func1<Person, Boolean>() {
@Override
public Boolean call(Person person) {
return person.age > 16;
}
})
.map(new Func1<Person, String>() {
@Override
public String call(Person person) {
return person.name;
}
})
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
});
Observable.from(people)
.filter(person -> person.age > 16)
.map(person -> person.name)
.subscribe(s -> System.out.println(s));
Method References
Method References são uma versão ainda mais simplificada de lambdas,
onde o argumento é simplesmentes repassado para outra função
Observable.from(people)
.filter(person -> person.age > 16)
.map(person -> person.name)
.subscribe(System.out::println); // .subscribe(s -> System.out.println(s));
Try-with-resources
Sintaxe melhorada para objetos que precisam ser fechados após seu uso.
// Java 7
BufferedReader br = new BufferedReader(new FileReader(path));
try {
System.out.println(br.readLine());
} finally {
if (br != null) br.close();
}
// Java 8
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
System.out.println(br.readLine());
}
Default Methods para Interfaces
interface Vehicle {
default void print(){
System.out.println("I am a vehicle!");
}
}
class Car implements Vehicle {
public void print(){
Vehicle.super.print();
System.out.println("I am a car!");
}
}
class Boat implements Vehicle {
}
Trazendo o Java 8 para o Android
Jack
Nova ferramenta do Android para compilar código Java para .dex
Introduzido no Android N
Suporte a Lambdas e Method References para todas as versões
Suporte a Default Methods e Streams para Android 24+
Não traz java.time.*
Streams: LightweightStreams
Implementação da Streams API usando Collections do Java 7.
List<String> names = Stream.of(people)
.filter(p -> p.age > 16)
.map(p -> p.name)
.collect(Collectors.toList());
Method Count: 719 (1.1.2)
Streams: RxJava
Observáveis são fundamentalmente diferente de Streams (push vs pull),
mas pode-se ter o mesmo resultado usando
Observable.from(myCollection).
List<String> names = Observable.from(people)
.filter(p -> p.age > 16)
.map(p -> p.name)
.toList().toBlocking().first();
Method Count: 5492 (1.1.8)
Streams
// Stream
people.stream()
.filter(p -> p.age > 16)
.map(p -> p.name)
.collect(Collectors.toList());
// LightweightStreams
Stream.of(people)
.filter(p -> p.age > 16)
.map(p -> p.name)
.collect(Collectors.toList());
// RxJava
Observable.from(people)
.filter(p -> p.age > 16)
.map(p -> p.name)
.toList().toBlocking().first();
java.time.*:
ThreeTenABP
Versão otimizada para Android da biblioteca ThreeTenBP
Mesma implementação do java.time.*, tornando fácil refatoração futura
Method Count: 3280
Retrolambda
Transformar código Java 8 em código compatível com Java 5, 6 e 7
Opera em tempo de compilação
Suporte completo a Lambdas, Try-With-Resources e Method References
Suporte parcial a default methods
RetroLambda vs Jack
https://speakerdeck.com/jakewharton/exploring-hidden-java-costs-360-andev-july-2016?slide=126
Resumo
RL Jack RxJava LS TT
Streams 24+ ✔ ✔
Default Methods Parcial 24+
Lambda ✔ ✔
Method References ✔ ✔
Try-With-Resources ✔ ✔
java.time.* ✔
- RL: Retrolambda, LS: LightweightStreams, TT: ThreeTenABP
Referências
Jack
Jack e Java 8
Retrolambda
Lightweight Stream
ThreeTenABP
Estudo sobre API para date
RxJava
Retrolambda vs Jack
Obrigado
Dúvidas?
| |blog github linkedin

Mais conteúdo relacionado

Semelhante a Usando Java 8 no Android

JavaFX 8, Collections e Lambdas
JavaFX 8, Collections e LambdasJavaFX 8, Collections e Lambdas
JavaFX 8, Collections e LambdasjesuinoPower
 
Spring framework 2.5
Spring framework 2.5Spring framework 2.5
Spring framework 2.5Diego Pacheco
 
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015  - Interfaces Ricas com Rails e React.JSTDC São Paulo 2015  - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JSRodrigo Urubatan
 
Programação para Web II: JavaServer Pages
Programação para Web II:  JavaServer PagesProgramação para Web II:  JavaServer Pages
Programação para Web II: JavaServer PagesAlex Camargo
 
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”Rogério Moraes de Carvalho
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 
Palestra Sepai Alfredofurtado Introducao Ao Javafx
Palestra Sepai Alfredofurtado Introducao Ao JavafxPalestra Sepai Alfredofurtado Introducao Ao Javafx
Palestra Sepai Alfredofurtado Introducao Ao Javafxalfredofurtado
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao javaArmando Daniel
 
Java orientação a objetos (interfaces)
Java   orientação a objetos (interfaces)Java   orientação a objetos (interfaces)
Java orientação a objetos (interfaces)Armando Daniel
 
C# 6.0 .net coders
C# 6.0   .net codersC# 6.0   .net coders
C# 6.0 .net codersRenato Groff
 
Python e Django
Python e DjangoPython e Django
Python e Djangopugpe
 

Semelhante a Usando Java 8 no Android (20)

Java8
Java8Java8
Java8
 
JavaFX 8, Collections e Lambdas
JavaFX 8, Collections e LambdasJavaFX 8, Collections e Lambdas
JavaFX 8, Collections e Lambdas
 
Spring framework 2.5
Spring framework 2.5Spring framework 2.5
Spring framework 2.5
 
1.introducao java
1.introducao java1.introducao java
1.introducao java
 
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015  - Interfaces Ricas com Rails e React.JSTDC São Paulo 2015  - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
 
Programação para Web II: JavaServer Pages
Programação para Web II:  JavaServer PagesProgramação para Web II:  JavaServer Pages
Programação para Web II: JavaServer Pages
 
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
Acessando banco de dados remoto com android
Acessando banco de dados remoto com android Acessando banco de dados remoto com android
Acessando banco de dados remoto com android
 
Minicurso Java
Minicurso JavaMinicurso Java
Minicurso Java
 
Palestra Sepai Alfredofurtado Introducao Ao Javafx
Palestra Sepai Alfredofurtado Introducao Ao JavafxPalestra Sepai Alfredofurtado Introducao Ao Javafx
Palestra Sepai Alfredofurtado Introducao Ao Javafx
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao java
 
Java1
Java1Java1
Java1
 
Java orientação a objetos (interfaces)
Java   orientação a objetos (interfaces)Java   orientação a objetos (interfaces)
Java orientação a objetos (interfaces)
 
C# 6.0 .net coders
C# 6.0   .net codersC# 6.0   .net coders
C# 6.0 .net coders
 
Introdução a tecnologia Java
Introdução a tecnologia JavaIntrodução a tecnologia Java
Introdução a tecnologia Java
 
Introdução a tecnologia Java
Introdução a tecnologia JavaIntrodução a tecnologia Java
Introdução a tecnologia Java
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
Python e Django
Python e DjangoPython e Django
Python e Django
 

Usando Java 8 no Android

  • 1. Usando Java 8 no Android Eduardo Bonet
  • 2. Motivação Java 8 foi lançado há mais de 2 anos, trazendo diversas novidades, mas que não chegaram ao Android. A nova toolchain (Jack & Jill) trouxe um suporte limitado de algumas features, porém deixou outras de fora e algumas são suportadas apenas de Android N para frente.
  • 3. Java 8 Redução de verbosidade Novas API's: java.time.* java.util.stream.* java.util.function.* Mudanças na linguagem: Default Methods e métodos estáticos para Interfaces Lambda Method References
  • 4. Streams API melhorada para manuseio de coleções, facilitando execução paralela // Java 7 names = new ArrayList<>(); for (Person p : people) { if(p.age > 16) names.add(p.name); } // Java 8 names = people.stream() .filter(p -> p.age > 16) .map(p -> p.name) .collect(Collectors.toList());
  • 5. Time API Nova API para lidar com data e hora, substituindo as classes java.util.Calendar e java.util.Date. // Java7 Date date, datePlusThreeDays; date = new GregorianCalendar(2014, Calendar.FEBRUARY, 11).getTime() Calendar c = Calendar.getInstance(); c.setTime(date); c.add(Calendar.DATE, 3) datePlusThreeDays = c.getTime() // Java 8 LocalDate otherDate, otherDatePlusThreeDays; otherDate = LocalDate.of(2014, Month.FEBRUARY, 11); otherDatePlusThreeDays = otherDate.plus(3, ChronoUnit.DAYS);
  • 6. Lambdas Lambdas fornecem uma sintaxe muito mais limpa para Functors. // Java 7 v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.d(TAG, "onClick: "); } }); // Java 8 Lambda v.setOnClickListener(view -> Log.d(TAG, "onClick: "));
  • 7. Observable.from(people) .filter(new Func1<Person, Boolean>() { @Override public Boolean call(Person person) { return person.age > 16; } }) .map(new Func1<Person, String>() { @Override public String call(Person person) { return person.name; } }) .subscribe(new Action1<String>() { @Override public void call(String s) { System.out.println(s); } }); Observable.from(people) .filter(person -> person.age > 16) .map(person -> person.name) .subscribe(s -> System.out.println(s));
  • 8. Method References Method References são uma versão ainda mais simplificada de lambdas, onde o argumento é simplesmentes repassado para outra função Observable.from(people) .filter(person -> person.age > 16) .map(person -> person.name) .subscribe(System.out::println); // .subscribe(s -> System.out.println(s));
  • 9. Try-with-resources Sintaxe melhorada para objetos que precisam ser fechados após seu uso. // Java 7 BufferedReader br = new BufferedReader(new FileReader(path)); try { System.out.println(br.readLine()); } finally { if (br != null) br.close(); } // Java 8 try (BufferedReader br = new BufferedReader(new FileReader(path))) { System.out.println(br.readLine()); }
  • 10. Default Methods para Interfaces interface Vehicle { default void print(){ System.out.println("I am a vehicle!"); } } class Car implements Vehicle { public void print(){ Vehicle.super.print(); System.out.println("I am a car!"); } } class Boat implements Vehicle { }
  • 11. Trazendo o Java 8 para o Android
  • 12. Jack Nova ferramenta do Android para compilar código Java para .dex Introduzido no Android N Suporte a Lambdas e Method References para todas as versões Suporte a Default Methods e Streams para Android 24+ Não traz java.time.*
  • 13. Streams: LightweightStreams Implementação da Streams API usando Collections do Java 7. List<String> names = Stream.of(people) .filter(p -> p.age > 16) .map(p -> p.name) .collect(Collectors.toList()); Method Count: 719 (1.1.2)
  • 14. Streams: RxJava Observáveis são fundamentalmente diferente de Streams (push vs pull), mas pode-se ter o mesmo resultado usando Observable.from(myCollection). List<String> names = Observable.from(people) .filter(p -> p.age > 16) .map(p -> p.name) .toList().toBlocking().first(); Method Count: 5492 (1.1.8)
  • 15. Streams // Stream people.stream() .filter(p -> p.age > 16) .map(p -> p.name) .collect(Collectors.toList()); // LightweightStreams Stream.of(people) .filter(p -> p.age > 16) .map(p -> p.name) .collect(Collectors.toList()); // RxJava Observable.from(people) .filter(p -> p.age > 16) .map(p -> p.name) .toList().toBlocking().first();
  • 16. java.time.*: ThreeTenABP Versão otimizada para Android da biblioteca ThreeTenBP Mesma implementação do java.time.*, tornando fácil refatoração futura Method Count: 3280
  • 17. Retrolambda Transformar código Java 8 em código compatível com Java 5, 6 e 7 Opera em tempo de compilação Suporte completo a Lambdas, Try-With-Resources e Method References Suporte parcial a default methods
  • 19. Resumo RL Jack RxJava LS TT Streams 24+ ✔ ✔ Default Methods Parcial 24+ Lambda ✔ ✔ Method References ✔ ✔ Try-With-Resources ✔ ✔ java.time.* ✔ - RL: Retrolambda, LS: LightweightStreams, TT: ThreeTenABP
  • 20. Referências Jack Jack e Java 8 Retrolambda Lightweight Stream ThreeTenABP Estudo sobre API para date RxJava Retrolambda vs Jack