A biblioteca do Guava: Quais são seus recursos mais úteis e / ou ocultos? [fechadas]

131

Eu fiz uma varredura rápida da API do Guava e dos novos tipos de coleção que ela fornece ( Multimape, BiMappor exemplo, parecem úteis) e estou pensando em incluir a biblioteca nos projetos nos quais trabalho.

No entanto, também tenho a reticência de incluir bibliotecas à vontade, se não forem de grande benefício, e o aprendizado dos recursos desperdiça um tempo valioso.

Você incluiu a biblioteca Guava no seu projeto e se mostrou útil de alguma maneira inesperada? Você sempre o usaria no futuro? Qual tem sido seu principal benefício / economia de tempo? Quais são seus recursos ocultos?

NimChimpsky
fonte
4
Seu título e sua pergunta realmente não correspondem.
precisa saber é o seguinte
4
"os novos tipos de coleção ... parecem úteis" e "tenho a reticência de incluir bibliotecas ... se elas não oferecem grande benefício" - bem, qual é então? Você quer que a biblioteca é útil e tem benefício ou você não fizer isso
Matt b
A partir de 2017 (pergunta agora encerrada), se você estiver usando a goiaba Gradle (4.4.1) mais recente 21.0 será adicionada ao build.gradle por padrão como uma dependência, com as palavras "Essa dependência é usada internamente e não exposta aos consumidores em seu próprio caminho de classe de compilação ", sugerindo que a equipe Gradle decidiu que há algumas coisas realmente valiosas lá.
mike roedor

Respostas:

158

Sério, tudo na Goiaba é útil. Eu o uso há bastante tempo e ainda estou sempre descobrindo algo novo que posso fazer com isso, que requer menos código do que fazê-lo manualmente.

Algumas coisas que outros realmente não mencionaram que eu amo:

  • Multimaps são ótimos. Sempre que você usar algo como Map<Foo, Collection<Bar>>, use uma multimapa e economize uma tonelada de verificação tediosa para uma coleção existente mapeada para uma chave, criando e adicionando-a, se não estiver lá.
  • Orderingé ótimo para construir Comparators que se comportam exatamente como você deseja.
  • Maps.uniqueIndexe Multimaps.index: estes métodos levam um Iterablee um Functione construir uma ImmutableMapou ImmutableListMultimapque indexa os valores na Iterablepelo resultado da aplicação da função para cada. Portanto, com uma função que recupera o ID de um item, você pode indexar uma lista de itens por seu ID em uma linha.
  • O material funcional que ele fornece ... filter, transformetc. Apesar da verbosidade de usar classes para Functions e Predicates, achei isso útil. Dou um exemplo de uma maneira de fazer isso bem lido aqui .
  • ComparisonChainé uma classe pequena e facilmente esquecida, útil quando você deseja escrever um método de comparação que compara vários valores em sucessão e deve retornar quando a primeira diferença for encontrada. Ele remove todo o tédio disso, tornando-o apenas algumas linhas de chamadas de método em cadeia.
  • Objects.equal(Object,Object) - nulo seguro é igual.
  • Objects.hashCode(Object...) - maneira fácil de obter um código hash com base em vários campos da sua classe.
  • Objects.firstNonNull(Object,Object) - reduz o código para obter um valor padrão se o primeiro valor for nulo, especialmente se o primeiro valor for o resultado de uma chamada de método (você teria que atribuí-lo a uma variável antes de fazer isso da maneira normal).
  • CharMatchers já foram mencionados, mas são muito poderosos.
  • Throwablespermite que você faça coisas agradáveis ​​com jogáveis, como o Throwables.propagateque reproduz novamente um jogável se for um RuntimeExceptionou um Errore o envolve em um RuntimeExceptione joga de outra maneira.

Eu certamente poderia continuar, mas tenho que começar a trabalhar. =) De qualquer forma, apesar de ter listado algumas coisas que gosto aqui, o fato é que tudo na Goiaba é útil em uma situação ou outra. Muito disso é útil com muita frequência. Ao usá-lo, você descobrirá mais usos. Não usá-lo será como ter uma mão amarrada nas costas.

ColinD
fonte
2
Concordo totalmente ComparisionChain.
Whiskeysierra
44

Uso o Guava há alguns anos, dentro do Google - e é maravilhoso.

As partes de que gosto particularmente são:

  • Charsets.* - tão simples, tão útil
  • Colecções
  • Manipulação de E / S (leia um recurso completamente em uma única linha, etc)
  • Splitter/Joiner
  • Preconditions
Jon Skeet
fonte
6
Observe que agora temos StandardCharsets em Java 7+. Gostaria de saber quantos outros recursos do Guava encontraram seu caminho para Java.
22416 DavidS
1
Encontrei este Modernizer Maven Plugin que detecta o uso de APIs herdadas, incluindo bibliotecas de terceiros como o Guava. O arquivo de configuração parece conter 67 reprovações de goiaba, incluindo StandardCharsets.
Davids
28

Inicialmente, usei-o para coletas de taquigrafia. Por exemplo, em vez de:

Map<String, Map<Long, List<String>>> map = new HashMap<String, Map<Long, List<String>>>();

você consegue fazer isso:

Map<String, Map<Long, List<String>>> map = Maps.newHashMap();

Também é fácil preencher mapas:

ImmutableMap<String,String> map = ImmutableMap.of("key1", "value1", "key2", "value2");

Agora, eu descobri alguns outros utilitários úteis presentes no Guava. Por exemplo, a classe CharMatcher permite combinar sequências de caracteres. Você pode fazer:

CharMatcher.inRange('a','z').or(inRange('A','Z'));

ou

String phoneNumber = CharMatcher.DIGIT.retainFrom("my phone number is 123456789");
dogbane
fonte
21

O método pré-computado () (de origem ) do CharMatcher é um bom "recurso oculto" que encontrei no outro dia.

É realmente apenas uma otimização, que cria uma tabela de pesquisa (usando uma matriz de bits) e, em seguida, simplesmente consulta os caracteres para ver se eles "correspondem".

É o tipo de otimização oculta que você pode aproveitar ao usar uma biblioteca, que você pode não ter pensado em si mesmo em seu próprio código.

Obviamente, se você criar um CharMatcher complexo, que planeja usar várias vezes, lembre-se de chamar o método precomputed (), como:

CharMatcher complexMatcher = CharMatcher.anyOf("cat")
                                        .or(CharMatcher.DIGIT)
                                        .or(CharMatcher.WHITESPACE)
                                        .precomputed();
Etienne Neveu
fonte
Eu também tenho uma pergunta sobre goiaba ListenableFuture . Se possível, você pode revisar meu design e me ajudar a esclarecer algumas das minhas dúvidas e como devo lidar com elas? Recentemente, comecei a trabalhar com o Guava ListenableFuture e gosto muito, mas tendo alguma confusão sobre como usá-los com eficiência.
john
16

Aqui está um vídeo do YouTube do Google (palestrante: Kevin Bourrillion, engenheiro-chefe das principais bibliotecas Java do Google), que mostra a beleza das coleções do Google. Uma coisa que o Google fez, que acredito ser brilhante, é garantir a imutabilidade nas coleções.

Buhake Sindi
fonte
12

O Google Guava é uma biblioteca de utilitários, então duvido que haja uma classe matadora dentro dela. A coisa toda sobre utilidade é que você quase usa isso em todos os projetos que possui. Não me lembro de nenhum projeto que fiz que não use a coleção Java. E a verdade é que o utilitário de coleta do Google Guava é maravilhoso e deve estar no próprio Java SDK.

Escrevi três artigos sobre aulas no Google Guava:

E isso não é tudo, há muitas outras coisas que você pode fazer com a goiaba.

Nanda
fonte
8

Absolutamente muito super útil. É quase invariavelmente a primeira biblioteca adicionada a um novo projeto.

  1. Nós gostamos muito de Iterators / Iterables e da interface Function.
  2. A família de interfaces de serviço são ótimas abstrações
  3. Estamos tão comprometidos que começamos a usar as classes ImmutableXXX, nossos tipos de API, para comunicar que não podem ser alteradas.
  4. Os mapas de computação (do MapMaker) são maravilhosos em determinadas situações.

No geral, a biblioteca é de alta qualidade. A API é bem pensada, a implementação é sólida. Altamente recomendado.

Darren Gilroy
fonte
7

O MapMaker agora oferece caches LRU limitados - isso é uma maquinaria substancial escondida atrás de uma pequena API. Isso tem potencial para enorme utilidade, e eu ainda estou por todo o código.

Dimitris Andreou
fonte