10. Anexos
Aqui explicamos como instalar as ferramentas utilizadas neste documento em máquinas com Windows 7 a 10. Os leitores devem adaptar estas instruções ao seu próprio ambiente.
10.1. Instalação de um JDK
O JDK mais recente pode ser encontrado no URL [http://www.oracle.com/technetwork/java/javase/downloads/index.html] (abril de 2016). Doravante, referir-nos-emos à pasta de instalação do JDK como <jdk-install>.
![]() |
10.2. Instalação do Android SDK Manager
![]() |
- Consulte [1] para saber por que precisamos do SDK do Android;
O Gestor do SDK do Android pode ser encontrado em [https://developer.android.com/studio/index.html#downloads] (maio de 2016).
![]() |
Instale o SDK Manager. Iremos referir-nos ao seu diretório de instalação como <sdk-manager-install> ( ). Inicie-o.
O projeto foi configurado para (ver secção 9.3.2):
- API SDK 23 [2];
- Ferramentas de compilação SDK 23.0.3 [3];
- a Ferramenta SDK 25.1.3 [4]
Certifique-se de que descarregou estes componentes.
10.3. Instalação do Genymotion Emulator Manager
Os emuladores fornecidos com o SDK do Android são lentos, o que desincentiva a sua utilização. A empresa [Genymotion] oferece um emulador de alto desempenho. Está disponível no URL [https://cloud.genymotion.com/page/launchpad/download/] (maio de 2016).
Terá de se registar para obter uma versão para uso pessoal. Descarregue o produto [Genymotion] com a máquina virtual VirtualBox:

A partir de agora, referir-nos-emos à pasta de instalação do [Genymotion] como <genymotion-install>. Inicie o [Genymotion]. Em seguida, descarregue uma imagem para um tablet:
![]() |
- em [1], adicione o terminal virtual descrito em [2];
10.4. Instalação do IDE IntelliJ IDEA Community Edition
O IDE [IntelliJ IDEA Community Edition] está disponível em [https://www.jetbrains.com/idea/#chooseYourEdition]:
![]() |
Instale o IDE e, em seguida, inicie-o.
![]() | ![]() |
- Em [1-2], configure os plugins;
- Em [3-4], adicione o plugin [Genymotion] ao IDE;
![]() |
- Em [6-7], configure o IDE;
![]() | ![]() |
- Em [8-9], especifique a pasta de instalação para o gestor do emulador [Genymotion];
![]() |
- Em [12-13], configure o tipo de projeto padrão;
![]() | ![]() |
![]() |
- em [14-16], configure o JDK;
![]() |
![]() | ![]() |
- Em [17-20], configure o SDK do Android;
![]() |
- Em [21-22], especifique o JDK padrão para os projetos;
![]() | ![]() |
![]() |
- Em [23-27], desative a verificação ortográfica, que está definida para inglês por predefinição;
![]() | ![]() |
- Em [28-32], escolha o tipo de atalhos de teclado que deseja. Pode manter as configurações predefinidas do IntelliJ ou escolher as de outro IDE com o qual esteja mais habituado;
![]() |
- Em [33-35], configure o IDE para vários projetos. Ele pode gerir vários projetos na mesma janela ou em janelas diferentes;
![]() |
- Em [36-37], ative a numeração de linhas por predefinição. Isto permitirá que encontre rapidamente a linha que causou uma exceção;
10.5. Utilização dos exemplos
Os projetos do IntelliJ IDEA para os exemplos estão disponíveis |AQUI|. A secção 1.3 explica como os abrir.
10.6. Gerir JSON em Java
De forma transparente para o programador, o framework [Spring MVC] utiliza a biblioteca JSON [Jackson]. Para ilustrar o que é JSON (JavaScript Object Notation), apresentamos aqui um programa que serializa objetos em JSON e faz o inverso, deserializando as cadeias de caracteres JSON geradas para recriar os objetos originais.
A biblioteca «Jackson» permite-lhe construir:
- a cadeia JSON de um objeto: new ObjectMapper().writeValueAsString(object);
- um objeto a partir de uma cadeia JSON: new ObjectMapper().readValue(jsonString, Object.class).
Ambos os métodos podem lançar uma IOException. Aqui está um exemplo.
![]() |
O projeto acima é um projeto Maven com o seguinte ficheiro [pom.xml];
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>istia.st</groupId>
<artifactId>json</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.3.3</version>
</dependency>
</dependencies>
</project>
- linhas 12–16: a dependência que inclui a biblioteca «Jackson»;
A classe [Person] é a seguinte:
package istia.st.json;
public class Personne {
// data
private String nom;
private String prenom;
private int age;
// manufacturers
public Personne() {
}
public Personne(String nom, String prénom, int âge) {
this.nom = nom;
this.prenom = prénom;
this.age = âge;
}
// signature
public String toString() {
return String.format("Personne[%s, %s, %d]", nom, prenom, age);
}
// getters and setters
...
}
A classe [Main] é a seguinte:
package istia.st.json;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class Main {
// the serialization / deserialization tool
static ObjectMapper mapper = new ObjectMapper();
public static void main(String[] args) throws IOException {
// creation of a person
Personne paul = new Personne("Denis", "Paul", 40);
// json display
String json = mapper.writeValueAsString(paul);
System.out.println("Json=" + json);
// person instantiation from Json
Personne p = mapper.readValue(json, Personne.class);
// person display
System.out.println("Personne=" + p);
// a picture
Personne virginie = new Personne("Radot", "Virginie", 20);
Personne[] personnes = new Personne[]{paul, virginie};
// json display
json = mapper.writeValueAsString(personnes);
System.out.println("Json personnes=" + json);
// dictionary
Map<String, Personne> hpersonnes = new HashMap<String, Personne>();
hpersonnes.put("1", paul);
hpersonnes.put("2", virginie);
// json display
json = mapper.writeValueAsString(hpersonnes);
System.out.println("Json hpersonnes=" + json);
}
}
A execução desta classe produz a seguinte saída no ecrã:
Pontos-chave do exemplo:
- o objeto [ObjectMapper] necessário para as transformações JSON/Object: linha 11;
- a transformação [Person] --> JSON: linha 17;
- a transformação de JSON para [Person]: linha 20;
- a [IOException] lançada por ambos os métodos: linha 13.
Índice
1 Introdução 5
1.1 Contexto 5
1.2 Ferramentas utilizadas 6
1.3 Os códigos de exemplo 6
2Um exemplo de introdução 9
2.1 A arquitetura da aplicação de exemplo 9
2.2 O executável 9
2.3 A interface síncrona 11
2.4 A chamada síncrona 12
2.5 Testar chamadas síncronas 13
2.6 A interface assíncrona e a sua implementação 14
2.7 A chamada assíncrona 16
2.8 Testar chamadas assíncronas 19
2.8.1 com o agendador [Schedulers.io] 20
2.8.2 com o agendador [Schedulers.computation] 20
2.8.3 com o agendador [Schedulers.newThread] 21
2.8.4 com os agendadores [Schedulers.trampoline, Schedulers.immediate] 22
2.9 Casos extremos 22
2.10 Conclusão 24
3Assinaturas de classes e métodos genéricos 27
4Expressões Lambda do Java 8 32
4.1Exemplo-01 - Interfaces funcionais e lambdas 32
4.2Exemplo-02 - A interface funcional Predicate<T> 34
4.3 Exemplo-03 - A interface funcional Function<T,R> 37
4.4 Exemplo-04 - A interface funcional Consumer<T> 38
4.5 Exemplo-05 - A interface funcional BiConsumer<T,U> 40
4.6 Exemplo-06 - A interface funcional BiFunction<T,U,R> 41
4.7 Exemplo-07 - A interface funcional Supplier<T> 43
5O tipo Stream<T> no Java 8 45
5.1Exemplo-01 - A classe Stream 45
5.2Exemplo-02 - Processamento paralelo de elementos de Stream 47
5.3 Exemplo 3 - Processamento paralelo de elementos de fluxo 48
5.4 Exemplo-04 - Filtragem de um fluxo 50
5.5 Exemplo-05 - Criar um Stream<T2> a partir de um Stream<T1> 52
5.6Exemplo-06 - Outros métodos da classe Stream<T> 53
5.6.1 [findFirst] 54
5.6.2 [findAny] 55
5.6.3 [skip] 56
5.6.4 [limit] 58
5.6.5[contagem] 59
5.6.6[máx., mín.] 60
5.6.7[reduzir] 63
5.6.8[ordenado] 63
5.6.9[anyMatch, noneMatch, allMatch] 65
5.6.10[collect(Collectors.groupingBy)] 65
5.6.11[distinct] 67
5.6.12[flatMap] 68
5.6.13 Métodos primitivos de fluxo numérico 71
6Interfaces funcionais na biblioteca RxJava 72
6.1 Exemplo-01: A interface funcional [Action0] 72
6.2 Exemplos 02 e 03: A interface funcional [Actioni] 73
6.3 Exemplos 04 e 05: A interface funcional [Funci] 74
7A biblioteca RxJava 77
7.1 Criar e subscrever Observables 77
7.1.1 Exemplo-01: O método [Observable.from] 77
7.1.2 Exemplo-03: A classe Observer 82
7.1.3 Exemplo-04: O método [Observable.create] 84
7.1.4Exemplo-05: Refatoração do [Exemplo-04] 86
7.2 Thread de execução, thread de observação 88
7.2.1 Exemplo-06: Observável e Observador numa thread diferente da [main] 88
7.2.2 Exemplo-07: Observável e observador em duas threads diferentes 90
7.3 Observáveis predefinidos 92
7.3.1 Exemplo-08: O método [Observable.range] 92
7.3.2 Exemplo-09: Os métodos Observable.[interval, take, doNext] 96
7.3.3 Exemplos-10/12: os métodos Observable.[error, empty, never] 98
7.4 Multithreading 102
7.4.1 Exemplo 13: Fio de ação, fio de observação 103
7.5 Combinações de múltiplos observáveis 106
7.5.1 Exemplo 14: Fusão de dois observáveis com [Observable.merge] 106
7.5.2 Exemplo 15: Concatenar dois observáveis com [Observable.concat] 108
7.5.3 Exemplo 16: Combinação de dois observáveis utilizando [Observable.zip] 109
7.5.4 Exemplo 17: Combinação de dois observáveis com [Observable.combineLatest] 111
7.5.5 Exemplo 18: Combinação de dois observáveis com [Observable.amb] 113
7.6 Cadeia de processamento para um observável 114
7.6.1 Exemplo 19: Transformar um observável com [Observable.map] 114
7.6.2 Exemplo 20: Filtrar um observável com [Observable.filter] 116
7.6.3 Exemplo 21: Transformar um observável com [Observable.flapMap] 117
7.6.4 Exemplo 22: Outros métodos da classe [Observable] 123
7.7 Agendadores 127
7.7.1 Exemplo 23: O agendador [Schedulers.computation] 127
7.7.2 Exemplo 24: O agendador [Schedulers.io] 128
7.7.3 Exemplo 25: O agendador [Schedulers.newThread] 129
7.7.4 Exemplo 26: Agendadores [Schedulers.immediate, Schedulers.trampoline] 130
7.8 Conclusão 133
8RxJava no ambiente Swing 134
8.1 Introdução 134
8.2 Estrutura do código 135
8.3 Execução do projeto 136
8.4 O Serviço Síncrono 136
8.5 O serviço assíncrono 139
8.6 A interface gráfica do utilizador 141
8.7 Instanciação da interface gráfica do utilizador 143
8.8 Executar pedidos síncronos 144
8.9 Executar pedidos assíncronos 145
9 RxJava no ambiente Android 149
9.1 Introdução 149
9.2 O serviço Web / JSON 149
9.2.1 O projeto IntelliJ IDEA 150
9.2.2 As dependências Gradle do projeto 151
9.2.3 A camada [de negócios] 153
9.2.4 O serviço Web / JSON 156
9.2.5 Configuração do projeto Spring 160
9.2.6 Execução do servidor Web 161
9.3 O cliente Android 161
9.3.1 RxAndroid 161
9.3.2 O projeto IntelliJ IDEA 162
9.3.3 Executar o projeto IntelliJ IDEA 164
9.3.4 As dependências Gradle do projeto 166
9.3.5 O manifesto da aplicação Android 167
9.3.6 A camada [DAO] 168
9.3.6.1 A interface [IDao] da camada [DAO] 168
9.3.6.2 Implementação da camada [DAO] 170
9.3.7 Visualizações da aplicação 172
9.3.7.1 A classe [MyFragment] 174
9.3.7.2 O fragmento [RequestFragment] da solicitação 176
9.3.7.3 O [ResponseFragment] da resposta 177
9.3.7.4 O [MainActivity] do Android 178
9.3.7.5 O fragmento [RequestFragment] 185
9.3.7.6 O fragmento [ResponseFragment] 187
9.3.8 Exemplos de Observáveis 190
9.3.8.1 Exemplo-01 190
9.3.8.2 Exemplo-02 193
9.3.8.3 Exemplo-03 195
9.3.8.4 Exemplo-04 197
9.3.8.5 Exemplo-05 198
9.3.8.6Continuar 202
9.3.9 Conclusão 202
10Anexos 203
10.1 Instalação de um JDK 203
10.2 Instalação do Gestor do SDK do Android 203
10.3 Instalação do Genymotion Emulator Manager 204
10.4 Instalação do IDE IntelliJ IDEA Community Edition 205
10.5 Utilização dos exemplos 210
10.6 Trabalhar com JSON em Java 211

























