Метод collect() является конечной операцией, которая используется для представление результата в виде коллекции или какой-либо другой структуры данных.
collect() принимает на вход Collector<Тип_источника, Тип_аккумулятора, Тип_результата>, который содержит четыре этапа: supplier - инициализация аккумулятора, accumulator - обработка каждого элемента, combiner - соединение двух аккумуляторов при параллельном выполнении, [finisher] - необязательный метод последней обработки аккумулятора. В Java 8 в классе Collectors реализовано несколько распространённых коллекторов:
● toList(), toCollection(), toSet() - представляют стрим в виде списка, коллекции или множества;
● toConcurrentMap(), toMap() - позволяют преобразовать стрим в Map;
● averagingInt(), averagingDouble(), averagingLong() - возвращают среднее значение;
● summingInt(), summingDouble(), summingLong() - возвращает сумму;
● summarizingInt(), summarizingDouble(), summarizingLong() - возвращают SummaryStatistics с разными агрегатными значениями;
● partitioningBy() - разделяет коллекцию на две части по соответствию условию и возвращает их как Map<Boolean, List>;
|
|
● groupingBy() - разделяет коллекцию на несколько частей и возвращает Map<N, List<T>>;
● mapping() - дополнительные преобразования значений для сложных Collector-ов.
Также существует возможность создания собственного коллектора через Collector.of():
Collector<String, List<String>, List<String>> toList = Collector.of(
ArrayList::new,
List::add,
(l1, l2) -> { l1.addAll(l2); return l1; }
);
Для чего в стримах применяются методы forEach() и forEachOrdered()?
forEach() применяет функцию к каждому объекту стрима, порядок при параллельном выполнении не гарантируется;
forEachOrdered() применяет функцию к каждому объекту стрима с сохранением порядка элементов.
Для чего в стримах предназначены методы map() и mapToInt(), mapToDouble(), mapToLong()?
Метод map() является промежуточной операцией, которая заданным образом преобразует каждый элемент стрима.
mapToInt(), mapToDouble(), mapToLong() - аналоги map(), возвращающие соответствующий числовой стрим (то есть стрим из числовых примитивов):
Stream
.of("12", "22", "4", "444", "123")
.mapToInt(Integer::parseInt)
.toArray(); //[12, 22, 4, 444, 123]
Какова цель метода filter() в стримах?
Метод filter() является промежуточной операцией принимающей предикат, который фильтрует все элементы, возвращая только те, что соответствуют условию.
Для чего в стримах предназначен метод limit()?
Метод limit() является промежуточной операцией, которая позволяет ограничить выборку определенным количеством первых элементов.
Для чего в стримах предназначен метод sorted()?
Метод sorted() является промежуточной операцией, которая позволяет сортировать значения либо в натуральном порядке, либо задавая Comparator.
Порядок элементов в исходной коллекции остается нетронутым - sorted() всего лишь создает его отсортированное представление.
|
|
Для чего в стримах предназначены методы flatMap(), flatMapToInt(), flatMapToDouble(), flatMapToLong()?
Метод flatMap() похож на map, но может создавать из одного элемента несколько. Таким образом, каждый объект будет преобразован в ноль, один или несколько других объектов, поддерживаемых потоком. Наиболее очевидный способ применения этой операции — преобразование элементов контейнера при помощи функций, которые возвращают контейнеры.
Stream
.of("H e l l o", "w o r l d!")
.flatMap((p) -> Arrays.stream(p.split(" ")))
.toArray(String[]::new);//["H", "e", "l", "l", "o", "w", "o", "r", "l", "d", "!"]
flatMapToInt(), flatMapToDouble(), flatMapToLong() - это аналоги flatMap(), возвращающие соответствующий числовой стрим.