Neuer Stream, Komparator und Sammler in Guave 21
1. Einführung
Dieser Artikel ist der erste in der Reihe über die neuen Funktionen, die mit Version 21 der Google Guava-Bibliothek gestartet wurden. Wir werden neu hinzugefügte Klassen und einige wichtige Änderungen gegenüber früheren Versionen von Guava diskutieren.
Insbesondere werden Ergänzungen und Änderungen im Paketcommon.collecterläutert.
Guava 21 führt einige neue und nützliche Funktionen in das Paketcommon.collectein. Lassen Sie uns einen kurzen Blick auf einige dieser neuen Dienstprogramme werfen und wie wir sie optimal nutzen können.
2. Streams
Wir freuen uns alle über die neueste Erweiterung vonjava.util.stream.Stream in Java 8. Nun, Guava nutzt Streams jetzt gut und bietet das, was Oracle möglicherweise verpasst hat.
Streams ist eine statische Dienstprogrammklasse mit einigen dringend benötigten Dienstprogrammen für die Verarbeitung von Java 8-Streams.
2.1. Streams.stream()
Die KlasseStreams bietet vier Möglichkeiten zum Erstellen von Streams mitIterable,Iterator,Optional undCollection.
Die Stream-Erstellung mitCollection ist jedoch veraltet, da sie von Java 8 standardmäßig bereitgestellt wird:
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));
Die KlasseStreams bietet auch Aromen mitOptionalDouble,OptionalLong undOptionalInt. Diese Methoden geben einen Stream zurück, der nur das ansonsten leere Element enthält:
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()
Die KlasseStreamsbietet Methoden zum Verketten von mehr als einem homogenen Stream.
Stream concatenatedStreams = Streams.concat(streamFromCollection, streamFromIterable,streamFromIterator);
Die Funktionalität vonconcatgibt es in einigen Varianten -LongStream,IntStream undDoubleStream.
2.3. Streams.findLast()
Streams haben eine Dienstprogrammmethode, um das letzte Element im Stream mithilfe derfindLast()-Methode zu finden.
Diese Methode gibt entweder das letzte Element oderOptional.empty() zurück, wenn der Stream keine Elemente im Stream enthält:
List integers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
Optional lastItem = Streams.findLast(integers.stream());
Die MethodefindLast() funktioniert fürLongStream,IntStream undDoubleStream.
2.4. Streams.mapWithIndex()
Bei Verwendung der MethodemapWithIndex()enthält jedes Element des Streams Informationen zu seiner jeweiligen Position (Index):
mapWithIndex( Stream.of("a", "b", "c"), (str, index) -> str + ":" + index)
Dies gibtStream.of(“a:0″,”b:1″,”c:2”) zurück.
Gleiches kann mitIntStream,LongStream undDoubleStream unter Verwendung von überlastetenmapWithIndex() erreicht werden.
2.5. Streams.zip()
Um entsprechende Elemente von zwei Streams mit einer Funktion abzubilden, verwenden Sie einfach die Zip-Methode vonStreams:
Streams.zip(
Stream.of("candy", "chocolate", "bar"),
Stream.of("$1", "$2","$3"),
(arg1, arg2) -> arg1 + ":" + arg2
);
Dies gibtStream.of(“candy:$1″,”chocolate:$2″,”bar:$3”); zurück
Der resultierende Datenstrom ist nur so lang wie der kürzere der beiden Eingabedatenströme. Wenn ein Stream länger ist, wird sein zusätzliches Element ignoriert.
3. Comparators
Die Klasse von GuavaOrderingist veraltet und befindet sich in neueren Versionen in der Löschphase. Die meisten Funktionen der KlasseOrderingind bereits in JDK 8 enthalten.
Guava führtComparators ein, um zusätzliche Funktionen vonOrdering bereitzustellen, die noch nicht von den Java 8-Standardbibliotheken bereitgestellt werden.
Werfen wir einen kurzen Blick darauf.
3.1. Comparators.isInOrder()
Diese Methode gibt true zurück, wenn jedes Element in der Iterable größer oder gleich dem vorhergehenden ist, wie durchComparator angegeben:
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()
Ganz ähnlich derisInOrder()-Methode, aber sie hält strikt die Bedingung, das Element kann nicht gleich dem vorhergehenden sein, es muss größer sein als. Der vorherige Code gibt für diese Methode false zurück.
3.3. Comparators.lexicographical()
Diese API gibt eine neueComparator-Instanz zurück, die in lexikografischer Reihenfolge (Wörterbuch) sortiert und die entsprechenden Elemente paarweise vergleicht. Intern wird eine neue Instanz vonLexicographicalOrdering<S>() erstellt.
4. MoreCollectors
MoreCollectors enthält einige sehr nützlicheCollectors, die in Java 8java.util.stream.Collectors nicht vorhanden sind und nicht mit dem Typcom.google.common verknüpft sind.
Lassen Sie uns einige davon durchgehen.
4.1. MoreCollectors.toOptional()
Hier konvertiertCollector einen Stream, der null oder ein Element enthält, inOptional:
List numbers = Arrays.asList(1);
Optional number = numbers.stream()
.map(e -> e * 2)
.collect(MoreCollectors.toOptional());
Wenn der Stream mehr als ein Element enthält, wirft der KollektorIllegalArgumentException.
4.2. MoreCollectors.onlyElement()
Mit dieser API nimmtCollector einen Stream, der nur ein Element enthält, und gibt das Element zurück. Wenn der Stream mehr als ein Element enthält, wirft erIllegalArgumentException oder wenn der Stream null Elemente enthält, wirft erNoSuchElementException.
5. Interners.InternerBuilder
Dies ist eine interne Builder-Klasse für bereits vorhandeneInternersin der Guava-Bibliothek. Es bietet eine praktische Methode zum Definieren der Parallelitätsstufe und des Typs (schwach oder stark) vonInterner, die Sie bevorzugen:
Interners interners = Interners.newBuilder()
.concurrencyLevel(2)
.weak()
.build();
6. Fazit
In diesem kurzen Artikel haben wir die neu hinzugefügten Funktionen incommon.collect package von Guava 21 untersucht.
Der Code für diesen Artikel lautet wie immeron Github.