Nouveau flux, comparateur et collecteur dans Guava 21

Nouveau cours d'eau, comparateur et collecteur à Guava 21

1. introduction

Cet article est le premier d'une série sur les nouvelles fonctionnalités lancées avec la version 21 de la bibliothèque Google Guava. Nous discuterons des classes nouvellement ajoutées et de certains changements majeurs par rapport aux versions précédentes de Guava.

Plus précisément, nous discuterons des ajouts et des modifications dans le packagecommon.collect.

Guava 21 introduit de nouvelles fonctionnalités utiles dans le packagecommon.collect; Jetons un coup d'œil à certains de ces nouveaux utilitaires et comment nous pouvons en tirer le meilleur parti.

2. Streams

Nous sommes tous ravis du dernier ajout dejava.util.stream.Stream dans Java 8. Eh bien, Guava utilise maintenant bien les flux et fournit ce que Oracle aurait pu manquer.

Streams est une classe d'utilitaires statiques, avec quelques utilitaires indispensables pour gérer les flux Java 8.

2.1. Streams.stream()

La classeStreams offre quatre façons de créer des flux en utilisantIterable,Iterator,Optional etCollection.

Cependant, la création de flux à l'aide deCollection est obsolète, car elle est fournie par Java 8 prête à l'emploi:

List numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
Stream streamFromCollection = Streams.stream(numbers);
Stream streamFromIterator = Streams.stream(numbers.iterator());
Stream streamFromIterable = Streams.stream((Iterable) numbers);
Stream streamFromOptional = Streams.stream(Optional.of(1));

La classeStreams fournit également des saveurs avecOptionalDouble,OptionalLong etOptionalInt. Ces méthodes renvoient un flux ne contenant que cet élément, sinon un flux vide:

LongStream streamFromOptionalLong = Streams.stream(OptionalLong.of(1));
IntStream streamFromOptionalInt = Streams.stream(OptionalInt.of(1));
DoubleStream streamFromOptionalDouble = Streams.stream(OptionalDouble.of(1.0));

2.2. Streams.concat()

La classeStreams fournit des méthodes pour concaténer plus d'un flux homogène.

Stream concatenatedStreams = Streams.concat(streamFromCollection, streamFromIterable,streamFromIterator);

La fonctionnalitéconcat est disponible en plusieurs versions -LongStream,IntStream etDoubleStream.

2.3. Streams.findLast()

Streams ont une méthode utilitaire pour trouver le dernier élément du flux en utilisant la méthodefindLast().

Cette méthode retourne le dernier élément ouOptional.empty() si le flux est il n'y a aucun élément dans le flux:

List integers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
Optional lastItem = Streams.findLast(integers.stream());

La méthodefindLast() fonctionne pourLongStream,IntStream etDoubleStream.

2.4. Streams.mapWithIndex()

En utilisant la méthodemapWithIndex(), chaque élément du flux transporte des informations sur leur position respective (index):

mapWithIndex( Stream.of("a", "b", "c"), (str, index) -> str + ":" + index)

Cela renverraStream.of(“a:0″,”b:1″,”c:2”).

La même chose peut être obtenue avecIntStream,LongStream etDoubleStream en utilisant desmapWithIndex() surchargés.

2.5. Streams.zip()

Afin de mapper les éléments correspondants de deux flux en utilisant une fonction, utilisez simplement la méthode zip deStreams:

Streams.zip(
  Stream.of("candy", "chocolate", "bar"),
  Stream.of("$1", "$2","$3"),
  (arg1, arg2) -> arg1 + ":" + arg2
);

Cela renverraStream.of(“candy:$1″,”chocolate:$2″,”bar:$3”);

Le flux résultant ne sera aussi long que le plus court des deux flux d’entrée; si un flux est plus long, son élément supplémentaire sera ignoré.

3. Comparators

La classe GuavaOrdering est obsolète et en phase de suppression dans les versions plus récentes. La plupart des fonctionnalités de la classeOrdering sont déjà inscrites dans JDK 8.

Guava introduitComparators pour fournir des fonctionnalités supplémentaires deOrdering qui ne sont pas encore fournies par les bibliothèques standard Java 8.

Jetons un coup d'œil à ces derniers.

3.1. Comparators.isInOrder()

Cette méthode renvoie true si chaque élément de Iterable est supérieur ou égal au précédent, comme spécifié par lesComparator:

List integers = Arrays.asList(1,2,3,4,4,6,7,8,9,10);
boolean isInAscendingOrder = Comparators.isInOrder(
  integers, new AscedingOrderComparator());

3.2. Comparators.isInStrictOrder()

Assez similaire à la méthodeisInOrder() mais elle contient strictement la condition, l'élément ne peut pas être égal au précédent, il doit être supérieur à. Le code précédent renverra false pour cette méthode.

3.3. Comparators.lexicographical()

Cette API renvoie une nouvelle instance deComparator - qui trie dans l'ordre lexicographique (dictionnaire) en comparant les éléments correspondants par paires. En interne, il crée une nouvelle instance deLexicographicalOrdering<S>().

4. MoreCollectors

MoreCollectors contient desCollectors très utiles qui ne sont pas présents dans Java 8java.util.stream.Collectors et ne sont pas associés au typecom.google.common.

Passons en revue quelques-uns d’entre eux.

4.1. MoreCollectors.toOptional()

Ici,Collector convertit un flux contenant zéro ou un élément enOptional:

List numbers = Arrays.asList(1);
Optional number = numbers.stream()
  .map(e -> e * 2)
  .collect(MoreCollectors.toOptional());

Si le flux contient plus d'un élément - le collecteur lanceraIllegalArgumentException.

4.2. MoreCollectors.onlyElement()

Avec cette API, leCollector prend un flux contenant un seul élément et retourne l'élément; si le flux contient plus d'un élément, il renvoieIllegalArgumentException ou si le flux contient zéro élément, il renvoieNoSuchElementException.

5. Interners.InternerBuilder

Il s'agit d'une classe de générateur interne auxInterners déjà existants dans la bibliothèque Guava. Il fournit une méthode pratique pour définir le niveau de concurrence et le type (faible ou fort) deInterner que vous préférez:

Interners interners = Interners.newBuilder()
  .concurrencyLevel(2)
  .weak()
  .build();

6. Conclusion

Dans cet article rapide, nous avons exploré les fonctionnalités nouvellement ajoutées dans lescommon.collect package de Guava 21.

Le code de cet article peut être trouvéon Github, comme toujours.