Я пытаюсь дать ответ на ваш вопрос, как я где-то читал -
<R,A> R collect(Collector<? super T,A,R> collector)
R - тип результата А - промежуточный тип накопления коллектора коллектора - Коллектор описывающее уменьшение Возврат - результат восстановления
Выполняет изменчивую операцию сокращения элементов этого потока с использованием коллектора. Коллекционер инкапсулирует функции, используемые в качестве аргументов для сбора (Поставщик, BiConsumer, BiConsumer), позволяющий повторно использовать стратегии сбора и составные операции сбора, такие как группировка или разбиение на несколько уровней. Если поток параллелен, а коллектор является параллельным, и либо поток неупорядочен, либо коллектор неупорядочен, то будет выполняться параллельное восстановление (см. «Коллектор» для получения подробной информации о параллельном восстановлении.)
Это терминал операция.
При параллельном выполнении несколько промежуточных результатов могут быть созданы, заполнены и объединены, чтобы поддерживать изоляцию изменяемых структур данных. Поэтому даже при параллельном выполнении с не-потокобезопасными структурами данных (такими как ArrayList) дополнительная синхронизация не требуется для параллельной редукции.
Ниже будут накапливаться строки в ArrayList:
List<String> asList = stringStream.collect(Collectors.toList());
Ниже будет классифицировать объекты Person государством и городом, каскадный два коллектора вместе:
Map<String, Map<String, List<Person>>> peopleByStateAndCity
= personStream.collect(Collectors.groupingBy(Person::getState,
Collectors.groupingBy(Person::getCity)));
Я полагаю, вы уже знаете, что можете поступать правильно, цепляя вызовы 'map',' filter' и 'collect'. Итак, какова цель вашего запроса сделать это в одном вызове метода? Потому что «чувствует», как быть более эффективным? – Holger
@Holger Он связывает предварительное условие с функцией сопоставления, что помогает сделать очевидным одно предварительное условие для другого, а также сделать невозможным разорвать код, изменив порядок вызовов метода. –
Собственно, все наоборот. Никто не может сказать по сигнатуре одного метода, содержащей функцию сопоставления и предикат, который применяется первым. Напротив, с API «Stream» каждый понимает разницу между «map (...) .filter (...) .collect (...)» и «.filter (...) .map (...) .collect (...)'. И даже способен вывести значение других комбинаций, таких как 'map (...) .filter (...) .map (...) .collect (...)' ... – Holger