7 апреля 2019
Тэги: Collections, Java, Stream API.
Все методы Stream API можно разделить на две группы: промежуточные и терминальные (конечные). Промежуточные операции следует воспринимать как «отложенные», т.е. они не меняют сами данные, а только задают правила их изменения. А терминальные как раз инициируют всю цепочку преобразований и возвращают модифицированные данные.
Рассмотрим промежуточные операции. Все промежуточные операции возвращают типизированный интерфейс Stream<>.
Любое изменение исходного элемента можно делать с помощью метода map(). В качестве параметра метод принимает лямбда-выражение.
Во втором случае мы воспользовались краткой записью лямбда-выражения через method reference.
Отсеивание части объектов можно сделать с помощью метода filter().
Если требуется получить доступ к элементу, никак его при этом не меняя, нам поможет метод peek(). Например, в целях логирования мы хотим вывести значение элемента в консоль.
Если в стриме несколько элементов имеют одинаковые значения, а вы хотите получить только уникальные, используйте метод distinct().
Для сортировки используйте метод sorted(). По умолчанию он использует «натуральный порядок», т.е. сортировку по возрастанию.
Перегруженная версия этого метода принимает интерфейс Comparator, поэтому вы можете задать свои собственные правила сортировки или воспользоваться готовыми. Приведённый выше пример равносилен следующему:
Нетрудно догадаться, что обратную сортировку можно задать таким образом:
Для получения первых N элементов используйте метод limit(). В данном случае мы берём первые 3 элемента:
Чтобы пропустить нужное количество первых элементов, используйте метод skip(). Здесь мы пропускаем первые 4 элемента и получаем оставшиеся два:
Обратите внимание, что комбинация методов limit() и skip() позволяет организовать постраничный вывод информации. Например, в пользовательском интерфейсе мы отображаем по две записи на странице. Тогда, если у нас запросят вторую страницу, то выражение будет выглядеть так:
Предположим, у вас есть многомерная структура (двумерный массив элементов типа Integer) и вы хотите его развернуть (сделать «плоским»), просто помещая каждый подмассив в конец результирующего. В этом нам поможет метод flatMap():
В этой статье мы рассмотрели на примерах промежуточные методы Stream API, а во второй части рассмотрим уже терминальные (конечные) методы.
Kotlin, Java, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.
23.01.2021 12:11 Азамат
Не указано, что промежуточные операции не выполняются без терминальных. То есть тот же
Stream.of(1, 2, 3, 4, 5, 6)
.peek(System.out::println)
Ничего не сделает, если будет выглядеть так.
25.07.2024 19:08 Максим
Спасибо! Все доступно и интересно
30.09.2024 10:15
внатуре без терминалки peek не запустится. проверено.