Новый поток, компаратор и коллектор в Гуаве 21

Новый поток, компаратор и коллектор в Гуаве 21

1. Вступление

Эта статья является первой в серии о новых функциях, запущенных в Версии 21 библиотеки Google Guava. Мы обсудим недавно добавленные классы и некоторые важные изменения по сравнению с предыдущими версиями Guava.

В частности, мы обсудим дополнения и изменения в пакетеcommon.collect.

Guava 21 представляет некоторые новые полезные функции в пакетеcommon.collect; Давайте кратко рассмотрим некоторые из этих новых утилит и то, как мы можем извлечь из них максимальную пользу.

2. Streamsс

Мы все в восторге от последнего добавленияjava.util.stream.Stream в Java 8. Ну, теперь Guava хорошо использует потоки и предоставляет то, что, возможно, пропустил Oracle.

Streams - это статический служебный класс с некоторыми столь необходимыми служебными программами для обработки потоков Java 8.

2.1. Streams.stream()с

КлассStreams предоставляет четыре способа создания потоков с использованиемIterable,Iterator,Optional иCollection.

Тем не менее, создание потока с использованиемCollection устарело, поскольку оно предусмотрено Java 8 из коробки:

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));

КлассStreams также предоставляет ароматизаторы сOptionalDouble,OptionalLong иOptionalInt. Эти методы возвращают поток, содержащий только этот элемент, иначе пустой поток:

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()с

КлассStreams предоставляет методы для объединения более чем одного однородного потока.

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

Функциональностьconcat бывает нескольких видов -LongStream,IntStream иDoubleStream.

2.3. Streams.findLast()с

Streams имеет служебный метод для поиска последнего элемента в потоке с помощью методаfindLast().

Этот метод либо возвращает последний элемент, либоOptional.empty(), если в потоке нет элементов:

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

МетодfindLast() работает дляLongStream,IntStream иDoubleStream.

2.4. Streams.mapWithIndex()с

Используя методmapWithIndex(), каждый элемент потока несет информацию об их соответствующей позиции (индексе):

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

Это вернетStream.of(“a:0″,”b:1″,”c:2”).

То же самое может быть достигнуто с помощьюIntStream,LongStream иDoubleStream, используя перегруженныйmapWithIndex().

2.5. Streams.zip()с

Чтобы сопоставить соответствующие элементы двух потоков с помощью некоторой функции, просто используйте метод zipStreams:

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

Это вернетStream.of(“candy:$1″,”chocolate:$2″,”bar:$3”);

Результирующий поток будет только до тех пор, пока короче из двух входных потоков; если один поток длиннее, его дополнительный элемент будет игнорироваться.

3. Comparatorsс

Класс GuavaOrdering устарел и находится в стадии удаления в более новых версиях. Большинство функций классаOrdering уже включены в JDK 8.

Guava вводитComparators для обеспечения дополнительных функцийOrdering, которые еще не предусмотрены стандартными библиотеками Java 8.

Давайте быстро взглянем на них.

3.1. Comparators.isInOrder()с

Этот метод возвращает истину, если каждый элемент в Iterable больше или равен предыдущему, как указаноComparator:

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()с

Очень похоже на методisInOrder(), но строго выполняет условие, элемент не может быть равен предыдущему, он должен быть больше. Предыдущий код вернет false для этого метода.

3.3. Comparators.lexicographical()с

Этот API возвращает новый экземплярComparator, который сортирует в лексикографическом (словарном) порядке, сравнивая соответствующие элементы попарно. Внутри он создает новый экземплярLexicographicalOrdering<S>().

4. MoreCollectorsс

MoreCollectors содержит несколько очень полезныхCollectors, которых нет в Java 8java.util.stream.Collectors и которые не связаны с типомcom.google.common.

Давайте рассмотрим некоторые из них.

4.1. MoreCollectors.toOptional()с

ЗдесьCollector преобразует поток, содержащий ноль или один элемент, вOptional:

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

Если поток содержит более одного элемента - сборщик выдастIllegalArgumentException.

4.2. MoreCollectors.onlyElement()с

С этим APICollector берет поток, содержащий только один элемент, и возвращает этот элемент; если поток содержит более одного элемента, он выдаетIllegalArgumentException, или если поток содержит нулевой элемент, он выдаетNoSuchElementException.

5. Interners.InternerBuilderс

Это внутренний класс построителя для уже существующихInterners в библиотеке Guava. Он предоставляет удобный метод для определения уровня параллелизма и типа (слабый или сильный)Interner, который вы предпочитаете:

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

6. Заключение

В этой быстрой статье мы изучили недавно добавленную функциональность вcommon.collect package Guava 21.

Код для этой статьи, как всегда, находится вon Github.