De que se trata o artigo:

Neste artigo veremos algumas das bibliotecas do projeto Guava, desenvolvido pelo Google. Mostraremos, através da implementação de exemplos, como utilizar essas bibliotecas na prática, procurando destacar suas vantagens.

Em que situação o tema útil:

A ideia principal do Guava é simplificar o código com o uso de encapsulamento e classes utilitárias, além de conceitos de programação funcional. Sendo uma biblioteca base de uso geral, ela pode ser útil em praticamente qualquer projeto.

Resumo DevMan:

Neste artigo apresentaremos uma introdução ao projeto Guava, que contém diversas bibliotecas desenvolvidas pelo Google para simplificar a vida do programador e garantir o uso de boas práticas. Para isso, vamos analisar exemplos de uso de algumas das bibliotecas para resolver um problema simples de processamento de cadastros. Por fim, realizaremos uma breve descrição das bibliotecas que não forem cobertas pelos exemplos.

Guava é um projeto Java inicialmente desenvolvido internamente pelo Google, sendo depois disponibilizado como software open-source. Este projeto consiste de diversas bibliotecas básicas que, de acordo com o site que hospeda o projeto, são utilizadas pelos desenvolvedores do Google em seus projetos Java.

Algumas das principais bibliotecas são as Collections2, que complementa as Collections do Java e do Apache, adicionando classes utilitárias para a manipulação de estruturas como List, Set e Map. Uma facilidade introduzida por essas classes é o uso de reflexão para evitar a repetição de parâmetros, como na inicialização de uma lista do tipo String: ao invés de fazermos List<String> lista = new ArrayList<String>(), podemos fazer List<String> lista = Lists.newArrayList(), evitando assim a repetição do parâmetro <String>.

Além disso, são adicionadas algumas estruturas de dados novas, como o multi-mapa, que é essencialmente um mapa que permite entradas com a mesma chave e também o mapa bidirecional, que é um mapa onde dado um par de objetos, um pode ser usado para indexar o outro, ao contrário de um mapa tradicional, onde apenas um dos objetos é usado como chave. Também são introduzidas versões imutáveis de várias estruturas, sendo uma alternativa melhor que a versão oferecida pelo JDK. No site do projeto argumenta-se que esta última é verbosa, insegura e ineficiente.

Outro diferencial do Guava é o uso de conceitos de linguagens funcionais que, se aplicados corretamente, ajudam a simplificar o código e contribuem para a modularidade do sistema. Em resumo, as bibliotecas do Guava foram desenvolvidas como alternativa a outras bibliotecas como o a do JDK e do Apache, que segundo seu entendimento, não resolviam seus problemas de forma satisfatória.

Neste artigo, vamos implementar uma solução para um exemplo simples de processamento de cadastro e aproveitar para explorar algumas das facilidades que as bibliotecas do Guava têm a oferecer.

Exemplo: processamento de um registro de atividades

Suponha que uma escola mantém um registro de atividades em um arquivo de texto para um grupo de alunos. Cada atividade é composta por um aluno, um horário de início e um de fim. Para simplificar, vamos supor que os alunos podem ser identificados unicamente pelo nome e que os horários são sempre horas redondas (0 a 23). Nesse arquivo, cada linha corresponde a uma atividade, contendo uma String com o nome do aluno e dois inteiros indicando os horários. Os componentes estão separados por ponto-e-vírgula (formato csv), e um exemplo de tal arquivo é dado a seguir:


  jose ; 11; 12
  joao; 13; 15;
  joao; 16; 17
  maria; 11; 12;
   maria ; 13 ; 16;
  maria ; 15; 18;
   jose; 13;   17;

Guava IO: leitura e escrita de dados simplificadas

Para fazer a leitura desse arquivo em memória, podemos usar as bibliotecas de entrada e saída do Guava, que visam facilitar o processo de leitura e escrita de arquivos.

Guava em geral utiliza as classes InputSupplier e OutputSupplier ao invés de trabalhar com streams. Isso visa facilitar a manipulação de arquivos texto. Por exemplo, quando se trabalha com OutputSupplier, o flush e o fechamento do arquivo são feitas sem que o desenvolvedor precise lembrar-se desses detalhes. Há também classes utilitárias como a ByteStreams, que fornece funções úteis para trabalhar com InputStream e OutputStream, e a classe CharStreams, que trabalha com Reader e Writer. No nosso exemplo, usaremos a classe utilitária Files, que possui funções que leem diretamente o conteúdo a partir de um objeto do tipo File.

Em nosso caso, podemos usar o método readLines() da classe utilitária Files, que lê as linhas de um arquivo texto. A assinatura do método Files.readlines() é:

public static <T> T readLines(File file, Charset charset,
      LineProcessor<T> callback) throws IOException; 

A classe LineProcessor é uma interface com os métodos getResult() e processLine(), conforme apresenta a Listagem 1. O método processLine() funciona como um ...

Quer ler esse conteúdo completo? Tenha acesso completo