Серия новых функций Java8 (Stream)

Java

题图:by pixel2013 From pixabay

В прошлом выпуске мы анализировали ссылки в Java 8. В этом выпуске мы проанализируем еще одну важную новую функцию в Java 8: Stream. эта статья图片вперед отСеть параллельного программирования

Что такое поток?

В исходном коде Java8 Stream определяется следующим образом:

A sequence of elements supporting sequential and parallel aggregate operations.

Простым переводом является то, что поток — это набор элементов, который поддерживает последовательные и параллельные операции объединения.

Из этого определенияStreamМожно сказать, что это продвинутая версия.Iterator, Iterator может обходить элементы только один за другим, чтобы работать с элементами, но Stream может выполнять очень сложные операции, такие как поиск, фильтрация и сопоставление данных, а промежуточные операции могут повторяться все время.

Коллекции — это элементы хранения, потоки — это вычисления.

Поток можно понимать как конвейер (Pipeline), данные поступают с одной стороны конвейера, подвергаются различной обработке в середине, а затем выходят новые данные с другой стороны конвейера.

Несколько заметок:

    1. Сам поток не хранит элементы.
    1. Поток не изменяет исходный объект. Вместо этого они возвращают новый поток, содержащий результат.
    1. Потоковые операции выполняются лениво. Это означает, что они будут ждать, пока результат не понадобится перед выполнением.

Конвейер потока

  • Создать поток
  • Промежуточные операции: цепочка промежуточных операций, которые обрабатывают данные источника данных, но выполняются лениво.
  • Завершить операцию: выполнить цепочку промежуточных операций и получить результат, как указано в пункте 3 выше.

Создать поток

1. java.util.Collection имеет встроенные методы для получения потоков, которые являются последовательным потоком и параллельным потоком соответственно.

default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}

default Stream<E> parallelStream() {
    return StreamSupport.stream(spliterator(), true);
}

2. java.util.Arrays имеет встроенный метод получения потоков

public static <T> Stream<T> stream(T[] array) {
    return stream(array, 0, array.length);
}

3. java.util.stream.Stream имеет встроенные методы для создания потоков, а именно создание потоков через объекты и создание потоков через функции

public static<T> Stream<T> of(T t) {
    return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}

public static<T> Stream<T> of(T... values) {
    return Arrays.stream(values);
}

public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f) {
    Objects.requireNonNull(f);
    final Iterator<T> iterator = new Iterator<T>() {
        @SuppressWarnings("unchecked")
        T t = (T) Streams.NONE;

        @Override
        public boolean hasNext() {
            return true;
        }

        @Override
        public T next() {
            return t = (t == Streams.NONE) ? seed : f.apply(t);
        }
    };
    return StreamSupport.stream(Spliterators.spliteratorUnknownSize(
                iterator,
                Spliterator.ORDERED | Spliterator.IMMUTABLE), false);
}

public static<T> Stream<T> generate(Supplier<T> s) {
    Objects.requireNonNull(s);
    return StreamSupport.stream(
                new StreamSpliterators.InfiniteSupplyingSpliterator.OfRef<>(Long.MAX_VALUE, s), false);
}

Промежуточные операции (java.util.stream.Stream)

1. Усечение и нарезка

  • фильтр: фильтр
Stream<T> filter(Predicate<? super T> predicate);

filter

  • отличные: удалить повторяющиеся элементы (через equals и hashCode)
Stream<T> distinct();

distinct

  • лимит: ограничить количество
Stream<T> limit(long maxSize);

limit

  • пропустить: пропустить
Stream<T> skip(long n);

skip

Это немного похоже на оператор SQL?

2. Отображение

  • map
<R> Stream<R> map(Function<? super T, ? extends R> mapper);

map

  • mapToInt

  • mapToLong

  • mapToDouble

  • flatMap

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

flatMap

  • flatMapToInt
  • flatMapToLong
  • flatMapToDouble

3. Сортировать

  • sorted
Stream<T> sorted();
Stream<T> sorted(Comparator<? super T> comparator);

4. Упаковка

  • peek
Stream<T> peek(Consumer<? super T> action);

peek

Завершить операцию

найти и сопоставить

  • allMatch: проверьте, совпадают ли все элементы
boolean allMatch(Predicate<? super T> predicate);
  • anyMatch: проверьте, соответствует ли хотя бы один элемент
boolean anyMatch(Predicate<? super T> predicate);
  • noneMatch: проверьте, не совпадают ли все элементы
boolean noneMatch(Predicate<? super T> predicate);
  • findFirst: возвращает первый элемент
Optional<T> findFirst();
  • findAny: возвращает любой элемент в текущем потоке
Optional<T> findAny();
  • count: возвращает общее количество элементов в потоке
long count();
  • max: возвращает максимальное значение в потоке
Optional<T> max(Comparator<? super T> comparator);
  • min: возвращает минимальное значение в потоке
Optional<T> min(Comparator<? super T> comparator);
  • forEach: внутренняя итерация
void forEach(Consumer<? super T> action);

Статут

  • reduce
T reduce(T identity, BinaryOperator<T> accumulator);

Optional<T> reduce(BinaryOperator<T> accumulator);

<U> U reduce(U identity,
                 BiFunction<U, ? super T, U> accumulator,
                 BinaryOperator<U> combiner);

собирать

  • collect
<R, A> R collect(Collector<? super T, A, R> collector);

<R> R collect(Supplier<R> supplier,
                  BiConsumer<R, ? super T> accumulator,
                  BiConsumer<R, R> combiner);
  • Статический метод коллекторов
List<T> toList()
Set<T> toSet()
Collection<T> toCollection
Long counting
Integer summingInt
Double averagingInt
IntSummaryStatistics summarizingInt
String joining
Optional<T> maxBy
Optional<T> minBy
...

Разве стрим не очень удобен? В следующем выпуске мы проверим производительность последовательных потоков и параллельных потоков в Stream.

Публичный аккаунт WeChat:На мечеПожалуйста, обратите внимание на мою личную технологию общедоступного аккаунта WeChat, подпишитесь на дополнительный контент