Как получить стрим диапазона чисел java
Перейти к содержимому

Как получить стрим диапазона чисел java

  • автор:

Java 8 IntStream for an int range?

Is there a way to create an IntStream for a range of ints?

Like if I wanted to stream values 1 to 1000, I could invoke some IntStream static factory to stream that range?

1 Answer 1

Never mind, I don’t know why I missed it in the API documentation after reading it several times.

    The Overflow Blog
Linked
Related
Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.6.8.43486

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Java Stream API #неОпятьАСнова #javaJunior #java8

Эта статья, как и все последующие и предыдущие – моя попытка структурировать полученные знания в процессе изучения Java. Здесь тезисно собрана вся основная информация по теме и те формулировки, которые показались мне наиболее удачными и понятными. Это мой конспект, если хотите.

Статья будет полезна тем, кто изучает или повторяет основы Java Core.
И тем, кто готовится к
техническому интервью.

На источники, откуда черпалась информация, предоставлены ссылки в конце статьи.

Оглавление

Основные понятия

С выходом Java 8 появилась поддержка функционального программирования.
Стало возможным конструировать сложные цепочки операций над потоком данных.

Функциона́льное программи́рование — парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании).

Пакет java.util.stream содержит классы для поддержки операций с потоками элементов в функциональном стиле. Ключевой абстракцией, введенной в этом пакете, является Поток.

Stream API – по сути это поток данных и последовательные операции над ними.

Интерфейсы Stream, IntStream, LongStream и DoubleStream – это потоки объектов и примитивных типов int , long и double .

Интерфейс Stream<T>

Интерфейс Stream представляет собой последовательность элементов, поддерживающих последовательные и параллельные агрегатные операции.

К агрегатным операциям относят различные операции над выборкой, например, получение числа элементов, получение минимального, максимального и среднего значения в выборке, а также суммирование значений.

Stream не предоставляет средств для прямого доступа к элементам или манипулирования ими. Вместо этого он описывает источник данных и вычислительные операции, которые будут выполняться над этими данными.

Стрим примитивных типов

Чтобы обеспечить способ работы с тремя наиболее часто используемыми типами примитивов – int , long и double – библиотека java.util.stream включает три реализации стрима примитивов:

Создание потока примитивных типов mapToInt(), mapToDouble(), mapToLong()

Стримы примитивных типов данных имеют ряд уникальных методов, например диапазон и сумма всех элементов потока.

Методы диапазона доступны только для IntStream и LongStream.
Существует два метода получения стрима из диапазона чисел:

range(int startInclusive, int endExclusive)

rangeClosed(int startInclusive, int endInclusive)

В методе range() второй аргумент метода не входит в диапазон чисел, в то время как метод rangeClosed() включает его в диапазон.

Запустить Stream

Поток элементов может быть получен разными способами, например:

Stream из List

Stream из Map

Stream из массива, используя статический метод класса Arrays

Stream из элементов, используя статические методы Классов-потоков

Stream из строк буфера BufferedReader

Stream из строк файла через статический метод класса Files

Stream из случайных чисел Random

Операции над Stream

Операции над потоком элементов бывают:

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

Terminal – Конечные
Запускают всю цепь промежуточных операций, закрывают поток и возвращают модифицированные данные.

Промежуточные операции НЕ выполняются без терминальных.
После обработки стрим нельзя повторно использовать.

Операции над потоком могут выполняться как последовательно, так и параллельно.
Чтобы превратить обычный стрим в параллельный, нужно вызвать промежуточный оператор parallel()

Промежуточные операции. Intermediate

Данные операции удобно воспринимать как отложенные – они выполнятся когда их запустит конечная терминальная операция над стримом.

Провести операцию над каждым элементом peek()
Аналог forEach() , только промежуточный (нетерминальный)
Если в метод peek() передать функцию System.out::println , тогда все объекты будут выводиться на экран в момент, когда они будут проходить через поток.

Преобразовать данные из одного типа в другой map()
Можно передать функцию, которая преобразовывает один тип данных в другой.

Отфильтровать элементы filter()

Удалить дублирующиеся элементы distinct()

Сортировка и обратная сортировка элементов sorted()

Лимит количества элементов limit()

Пропустить первые элементы skip()

Сопоставить поток с развернутым потоком flatMap()
Возвращает поток, состоящий из результатов замены каждого элемента этого потока содержимым сопоставленного потока, полученного путем применения предоставленной функции сопоставления к каждому элементу.

Таким образом можно развернуть двухмерный массив

Конечные операции. Terminal

Запускают всю цепь промежуточных операций и возвращают конечный результат, закрывают поток.

Собрать элементы потока и преобразовать их к нужному типу collect()
В аргумент метода нужно передать объект Collector.

Преобразовать поток в List Collectors.toList()

Преобразовать поток в строку String Collectors.joining()

Итерация по каждому элементу forEach()

Узнать количество элементов стрима count()

Найти минимальное и максимальное значение min() и max()
Сравнение происходит с помощью объекта Comparator.
Возвращают объект класса Optional – объект-контейнер, который может хранить null .
Метод get() – возвращает значение, которое хранит объект Optional.

Comparator удобно задать с помощью лямбда-функции:

Найти первый подходящий элемент findFirst()
Возвращает первый подходящий элемент из стрима и завершается.
Возвращают объект класса Optional.

Найти любой подходящий элемент findAny()
Возвращает любой подходящий элемент из стрима и завершается.
Аналог метода findFirst() для потоков, которые обрабатываются параллельно.
Найденный элемент не обязательно будет первый по порядку в потоке.

Все элементы соответствуют условию allMatch()

Все элементы НЕ соответствуют условию noneMatch()

Хотя бы один элемент соответствует условию anyMatch()

Сумма элементов стрима sum()
Это метод классов-стримов примитивных типов данных:
IntStream, LongStream и DoubleStream

Операция сведения Stream.reduce()

Позволяет получить один результат из последовательности элементов, неоднократно применяя операцию комбинирования к элементам в последовательности.

Участники операции сведения:

Identity — элемент, который является начальным значением операции сокращения и результатом по умолчанию, если поток пуст.

Accumulator — функция, которая принимает два параметра: частичный результат операции сведения и следующий элемент потока

Combiner — функция, используемая для объединения частичного результата операции сокращения и типами реализации аккумулятора.
Если используем последовательные потоки, типы аргументов аккумулятора и типы его реализации не совпадаютнужно использовать Combiner.

Сумма элементов списка

Сумма элементов в параллельном потоке
В таких случаях нужно использовать функцию для объединения результатов подпотоков в один – это роль Combiner Комбинатора.
В приведенном примере эту роль выполняет метод Integer::sum

Объединение списка строк в одну сроку

Класс Optional

Методы интерфейса Stream findAny() , findFirst() , max() , min() и reduce() возвращают объект класса Optional

Это объект-контейнер, который может содержать или не содержать нулевое значение.
Ссылка на объект класса Optional может быть null
Если значение присутствует, метод isPresent() вернет true

Позволяет избавиться от проверки на null
Без этого класса приходилось писать проверку на NullPointerException.
Благодарю этому один объект Optional можно сравнить с другим объектом Optional через метод equals() , даже если они хранят в себе ссылки на null .

Получить элемент Optional get()
Метод класса Optoinal – возвращает значение, если оно присутствует, в противном случае бросит NoSuchElementException .

Класс Collectors

Метод collect() интерфейса Stream собирает данные в необходимую структуру данных, например в коллекции — List<T> , Set<T> , Map<T, R>

В метод collect() в качестве параметра принимает объект типа Collector.
Статические методы класса Collectors возвращают такой объект класса Collector.

Класс Collectors содержит статические методы для сбора элементов в коллекцию, обобщения и группировки элементов в соответствии с различными критериями и т. п., которые возвращают готовые объекты коллекций.

Преобразование потока в List toList()

Преобразование потока в Set toSet()

Преобразование потока в Map toMap()

Сумма элементов потока summingInt(), summingDouble(), summingLong()
Например, сумма заработной платы сотрудников

Сгруппировать элементы по условию groupingBy()
Группировка людей по стране

Метод IntStream range() в Java

Метод range() в классе IntStream в Java используется для возврата последовательного упорядоченного IntStream из startInclusive в endExclusive с шагом, равным 1. Это также включает startInclusive.

Синтаксис выглядит следующим образом –

Здесь параметр startInclusive включает начальное значение, тогда как endExclusive исключает последнее значение.

Для работы с классом IntStream в Java импортируйте следующий пакет:

Создайте IntStream и добавьте элементы потока в диапазон, используя метод range(). Это возвращает последовательный упорядоченный IntStream с шагом 1 в пределах диапазона –

Ниже приведен пример реализации:

Пример

Средняя оценка 4.3 / 5. Количество голосов: 10

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

Помогите улучшить статью.

Напишите комментарий, что можно добавить к статье, какой информации не хватает.

Interface IntStream

The following example illustrates an aggregate operation using Stream and IntStream , computing the sum of the weights of the red widgets: See the class documentation for Stream and the package documentation for java.util.stream for additional specification of streams, stream operations, stream pipelines, and parallelism.

Nested Class Summary

Method Summary

Methods declared in interface java.util.stream.BaseStream

Method Details

filter

mapToObj

mapToLong

mapToDouble

flatMap

mapMulti

If the consumer argument is used outside the scope of its application to the mapping function, the results are undefined.

distinct

sorted

For parallel stream pipelines, the action may be called at whatever time and in whatever thread the element is made available by the upstream operation. If the action modifies shared state, it is responsible for providing the required synchronization.

In cases where the stream implementation is able to optimize away the production of some or all the elements (such as with short-circuiting operations like findFirst , or in the example described in count() ), the action will not be invoked for those elements.

limit

takeWhile

If this stream is ordered then the longest prefix is a contiguous sequence of elements of this stream that match the given predicate. The first element of the sequence is the first element of this stream, and the element immediately following the last element of the sequence does not match the given predicate.

If this stream is unordered, and some (but not all) elements of this stream match the given predicate, then the behavior of this operation is nondeterministic; it is free to take any subset of matching elements (which includes the empty set).

Independent of whether this stream is ordered or unordered if all elements of this stream match the given predicate then this operation takes all elements (the result is the same as the input), or if no elements of the stream match the given predicate then no elements are taken (the result is an empty stream).

dropWhile

If this stream is ordered then the longest prefix is a contiguous sequence of elements of this stream that match the given predicate. The first element of the sequence is the first element of this stream, and the element immediately following the last element of the sequence does not match the given predicate.

If this stream is unordered, and some (but not all) elements of this stream match the given predicate, then the behavior of this operation is nondeterministic; it is free to drop any subset of matching elements (which includes the empty set).

Independent of whether this stream is ordered or unordered if all elements of this stream match the given predicate then this operation drops all elements (the result is an empty stream), or if no elements of the stream match the given predicate then no elements are dropped (the result is the same as the input).

forEach

For parallel stream pipelines, this operation does not guarantee to respect the encounter order of the stream, as doing so would sacrifice the benefit of parallelism. For any given element, the action may be performed at whatever time and in whatever thread the library chooses. If the action accesses shared state, it is responsible for providing the required synchronization.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *