Spec-Zone .ru
спецификации, руководства, описания, API
|
T
- тип входного элемента к собрать работеR
- тип результата собрать работыpublic interface Collector<T,R>
Collection
; конкатенация строк в a StringBuilder
; вычислительная информация о сводке об элементах, таких как сумма, минута, максимальная, или средний; вычисления сводок "сводной таблицы", таких как "максимальная оцененная транзакция продавцом", и т.д. операции Сокращения могут быть выполнены или последовательно или параллельно. Следующее является примерами использования предопределенного Collector
реализации в Collectors
с Stream
API, чтобы выполнить изменчивые задачи сокращения:
// Accumulate elements into a List
List<String> list = stream.collect(Collectors.toList());
// Accumulate elements into a TreeSet
Set<String> list = stream.collect(Collectors.toCollection(TreeSet::new));
// Convert elements to strings and concatenate them, separated by commas
String joined = stream.map(Object::toString)
.collect(Collectors.toStringJoiner(", "))
.toString();
// Find highest-paid employee
Employee highestPaid = employees.stream()
.collect(Collectors.maxBy(Comparators.comparing(Employee::getSalary)));
// Group employees by department
Map<Department, List<Employee>> byDept
= employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment));
// Find highest-paid employee by department
Map<Department, Employee> highestPaidByDept
= employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment,
Collectors.maxBy(Comparators.comparing(Employee::getSalary))));
// Partition students into passing and failing
Map<Boolean, List<Student>> passingFailing =
students.stream()
.collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD);
A Collector
определяется тремя функциями, которые сотрудничают, чтобы управлять контейнером результата или результата. Они: создание начального результата, включая новый элемент данных в результат, и комбинируя два результата в одного. Последняя функция - объединение двух результатов в один - используется во время параллельных операций, где подмножества ввода накапливаются параллельно, и затем подрезультаты, объединенные в объединенный результат. Результатом может быть изменчивый контейнер или значение. Если результат изменчив, накопление и функции комбинации могут или видоизменить их левый параметр и возврат, что (такие как добавляющие элементы к набору), или возвращают новый результат, когда это не должно выполнить мутацию.
У коллекторов также есть ряд характеристик, включая Collector.Characteristics.CONCURRENT
и Collector.Characteristics.STRICTLY_MUTATIVE
. Эти характеристики обеспечивают подсказки, которые могут использоваться реализацией сокращения, чтобы обеспечить лучшую производительность.
Библиотеки, которые реализуют сокращение, основанное на Collector
, такой как Stream.collect(Collector)
, должен придерживаться следующих ограничений:
resultSupplier()
, accumulator()
, или combiner()
.Collector
будучи должен реализовать любую дополнительную синхронизацию. Реализация сокращения должна управлять этим, ввод должным образом делится, что разделы обрабатываются в изоляции, и объединение происходит только после того, как накопление полно.Collector.Characteristics.UNORDERED
характеристики или если инициирующие данные неупорядочиваются.Collector
должен привести к результату, эквивалентному:
BiFunction<R,T,R> accumulator = collector.accumulator();
R result = collector.resultSupplier().get();
for (T t : data)
result = accumulator.apply(result, t);
return result;
Однако, библиотека свободна разделить ввод, выполнить сокращение на разделах, и затем использовать функцию объединителя, чтобы объединить частичные результаты достигнуть параллельного сокращения. В зависимости от определенной работы сокращения это может выполнить лучше или хуже, в зависимости от относительной стоимости функций объединителя и аккумулятора.
Пример работы, которая может быть легко смоделирована Collector
накапливает элементы в a TreeSet
. В этом случае, resultSupplier()
функция () -> new Treeset<T>()
, accumulator
функция (set, element) -> { set.add(element); return set; }
, и функция объединителя (left, right) -> { left.addAll(right); return left; }
. (Это поведение реализуется Collectors.toCollection(TreeSet::new)
). Ассоциативность TODO и коммутативность
Stream.collect(Collector)
, Collectors
Модификатор и Тип | Интерфейс и Описание |
---|---|
static class |
Коллектор. Характеристики
Характеристики, указывающие на свойства a
Collector , который может использоваться, чтобы оптимизировать реализации сокращения. |
Модификатор и Тип | Метод и Описание |
---|---|
BiFunction<R,T,R> |
accumulator()
Функция, которая сворачивает новое значение в совокупный результат.
|
Set<Collector.Characteristics> |
characteristics()
Возвраты a
Set из Collector.Characteristics указание на характеристики этого Коллектора. |
BinaryOperator<R> |
combiner()
Функция, которая принимает два частичных результата и объединяет их.
|
Supplier<R> |
resultSupplier()
Функция, которая создает и возвращает новый результат, который не представляет "значений".
|
Supplier<R> resultSupplier()
BiFunction<R,T,R> accumulator()
Если коллектор имеет Collector.Characteristics.STRICTLY_MUTATIVE
характеристика, тогда функция аккумулятора должна всегда возвращать свой первый параметр после возможного видоизменения ее состояния.
BinaryOperator<R> combiner()
Если коллектор имеет Collector.Characteristics.STRICTLY_MUTATIVE
характеристика, тогда функция объединителя должна всегда возвращать свой первый параметр после возможного видоизменения ее состояния.
Set<Collector.Characteristics> characteristics()
Set
из Collector.Characteristics
указание на характеристики этого Коллектора. Этот набор должен быть неизменным.
Для дальнейшей ссылки API и документации разработчика, см. Java Документация SE. Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2013, Oracle и/или его филиалы. Все права защищены.
Проект сборка-b92