Skip to content

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:

Image

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ã:

1
2
3
4
Json={"nom":"Denis","prenom":"Paul","age":40}
Personne=Personne[Denis, Paul, 40]
Json personnes=[{"nom":"Denis","prenom":"Paul","age":40},{"nom":"Radot","prenom":"Virginie","age":20}]
Json hpersonnes={"2":{"nom":"Radot","prenom":"Virginie","age":20},"1":{"nom":"Denis","prenom":"Paul","age":40}}

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