Added in [API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

# Collector

` public interface Collector `   
` `

|---|
| java.util.stream.Collector\<T, A, R\> |

<br />

*** ** * ** ***

A [mutable reduction operation](https://developer.android.com/reference/java/util/stream/package-summary#Reduction) that accumulates input elements into a mutable result container, optionally transforming the accumulated result into a final representation after all input elements have been processed. Reduction operations can be performed either sequentially or in parallel.

Examples of mutable reduction operations include: accumulating elements into a `Collection`; concatenating strings using a `StringBuilder`; computing summary information about elements such as sum, min, max, or average; computing "pivot table" summaries such as "maximum valued transaction by seller", etc. The class `https://developer.android.com/reference/java/util/stream/Collectors` provides implementations of many common mutable reductions.

A `Collector` is specified by four functions that work together to accumulate entries into a mutable result container, and optionally perform a final transform on the result. They are:

- creation of a new result container (`https://developer.android.com/reference/java/util/stream/Collector#supplier()`)
- incorporating a new data element into a result container (`https://developer.android.com/reference/java/util/stream/Collector#accumulator()`)
- combining two result containers into one (`https://developer.android.com/reference/java/util/stream/Collector#combiner()`)
- performing an optional final transform on the container (`https://developer.android.com/reference/java/util/stream/Collector#finisher()`)

Collectors also have a set of characteristics, such as `https://developer.android.com/reference/java/util/stream/Collector.Characteristics#CONCURRENT`, that provide hints that can be used by a reduction implementation to provide better performance.

A sequential implementation of a reduction using a collector would create a single result container using the supplier function, and invoke the accumulator function once for each input element. A parallel implementation would partition the input, create a result container for each partition, accumulate the contents of each partition into a subresult for that partition, and then use the combiner function to merge the subresults into a combined result.

To ensure that sequential and parallel executions produce equivalent results, the collector functions must satisfy an *identity* and an [associativity](https://developer.android.com/reference/java/util/stream/package-summary#Associativity) constraints.

The identity constraint says that for any partially accumulated result, combining it with an empty result container must produce an equivalent result. That is, for a partially accumulated result `a` that is the result of any series of accumulator and combiner invocations, `a` must be equivalent to `combiner.apply(a, supplier.get())`.

The associativity constraint says that splitting the computation must produce an equivalent result. That is, for any input elements `t1` and `t2`, the results `r1` and `r2` in the computation below must be equivalent:

    A a1 = supplier.get();
        accumulator.accept(a1, t1);
        accumulator.accept(a1, t2);
        R r1 = finisher.apply(a1);  // result without splitting

        A a2 = supplier.get();
        accumulator.accept(a2, t1);
        A a3 = supplier.get();
        accumulator.accept(a3, t2);
        R r2 = finisher.apply(combiner.apply(a2, a3));  // result with splitting
     
For collectors that do not have the `UNORDERED` characteristic, two accumulated results `a1` and `a2` are equivalent if `finisher.apply(a1).equals(finisher.apply(a2))`. For unordered collectors, equivalence is relaxed to allow for non-equality related to differences in order. (For example, an unordered collector that accumulated elements to a `List` would consider two lists equivalent if they contained the same elements, ignoring order.)

Libraries that implement reduction based on `Collector`, such as `https://developer.android.com/reference/java/util/stream/Stream#collect(java.util.stream.Collector<?%20super%20T,A,R>)`, must adhere to the following constraints:

- The first argument passed to the accumulator function, both arguments passed to the combiner function, and the argument passed to the finisher function must be the result of a previous invocation of the result supplier, accumulator, or combiner functions.
- The implementation should not do anything with the result of any of the result supplier, accumulator, or combiner functions other than to pass them again to the accumulator, combiner, or finisher functions, or return them to the caller of the reduction operation.
- If a result is passed to the combiner or finisher function, and the same object is not returned from that function, it is never used again.
- Once a result is passed to the combiner or finisher function, it is never passed to the accumulator function again.
- For non-concurrent collectors, any result returned from the result supplier, accumulator, or combiner functions must be serially thread-confined. This enables collection to occur in parallel without the `Collector` needing to implement any additional synchronization. The reduction implementation must manage that the input is properly partitioned, that partitions are processed in isolation, and combining happens only after accumulation is complete.
- For concurrent collectors, an implementation is free to (but not required to) implement reduction concurrently. A concurrent reduction is one where the accumulator function is called concurrently from multiple threads, using the same concurrently-modifiable result container, rather than keeping the result isolated during accumulation. A concurrent reduction should only be applied if the collector has the `https://developer.android.com/reference/java/util/stream/Collector.Characteristics#UNORDERED` characteristics or if the originating data is unordered.

In addition to the predefined implementations in `https://developer.android.com/reference/java/util/stream/Collectors`, the static factory methods `https://developer.android.com/reference/java/util/stream/Collector#of(java.util.function.Supplier<R>,%20java.util.function.BiConsumer<R,T>,%20java.util.function.BinaryOperator<R>,%20java.util.stream.Collector.Characteristics[])` can be used to construct collectors. For example, you could create a collector that accumulates widgets into a `TreeSet` with:

    Collector<Widget, ?, TreeSet<Widget>> intoSet =
            Collector.of(TreeSet::new, TreeSet::add,
                         (left, right) -> { left.addAll(right); return left; });

(This behavior is also implemented by the predefined collector `https://developer.android.com/reference/java/util/stream/Collectors#toCollection(java.util.function.Supplier<C>)`).

<br />

**See also:**

- `https://developer.android.com/reference/java/util/stream/Stream#collect(java.util.stream.Collector<?%20super%20T,A,R>)`
- `https://developer.android.com/reference/java/util/stream/Collectors`

## Summary

| ### Public methods ||
|---|---|
| ` abstract https://developer.android.com/reference/java/util/function/BiConsumer<A, T>` | ` https://developer.android.com/reference/java/util/stream/Collector#accumulator()() ` A function that folds a value into a mutable result container. |
| ` abstract https://developer.android.com/reference/java/util/Set<https://developer.android.com/reference/java/util/stream/Collector.Characteristics>` | ` https://developer.android.com/reference/java/util/stream/Collector#characteristics()() ` Returns a `Set` of `Collector.Characteristics` indicating the characteristics of this Collector. |
| ` abstract https://developer.android.com/reference/java/util/function/BinaryOperator<A>` | ` https://developer.android.com/reference/java/util/stream/Collector#combiner()() ` A function that accepts two partial results and merges them. |
| ` abstract https://developer.android.com/reference/java/util/function/Function<A, R>` | ` https://developer.android.com/reference/java/util/stream/Collector#finisher()() ` Perform the final transformation from the intermediate accumulation type `A` to the final result type `R`. |
| ` static <T, A, R> https://developer.android.com/reference/java/util/stream/Collector<T, A, R>` | ` https://developer.android.com/reference/java/util/stream/Collector#of(java.util.function.Supplier<A>,%20java.util.function.BiConsumer<A,T>,%20java.util.function.BinaryOperator<A>,%20java.util.function.Function<A,R>,%20java.util.stream.Collector.Characteristics[])(https://developer.android.com/reference/java/util/function/Supplier<A> supplier, https://developer.android.com/reference/java/util/function/BiConsumer<A, T> accumulator, https://developer.android.com/reference/java/util/function/BinaryOperator<A> combiner, https://developer.android.com/reference/java/util/function/Function<A, R> finisher, https://developer.android.com/reference/java/util/stream/Collector.Characteristics characteristics) ` Returns a new `Collector` described by the given `supplier`, `accumulator`, `combiner`, and `finisher` functions. |
| ` static <T, R> https://developer.android.com/reference/java/util/stream/Collector<T, R, R>` | ` https://developer.android.com/reference/java/util/stream/Collector#of(java.util.function.Supplier<R>,%20java.util.function.BiConsumer<R,T>,%20java.util.function.BinaryOperator<R>,%20java.util.stream.Collector.Characteristics[])(https://developer.android.com/reference/java/util/function/Supplier<R> supplier, https://developer.android.com/reference/java/util/function/BiConsumer<R, T> accumulator, https://developer.android.com/reference/java/util/function/BinaryOperator<R> combiner, https://developer.android.com/reference/java/util/stream/Collector.Characteristics characteristics) ` Returns a new `Collector` described by the given `supplier`, `accumulator`, and `combiner` functions. |
| ` abstract https://developer.android.com/reference/java/util/function/Supplier<A>` | ` https://developer.android.com/reference/java/util/stream/Collector#supplier()() ` A function that creates and returns a new mutable result container. |

## Public methods

### accumulator

Added in [API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public abstract BiConsumer<A, T> accumulator ()
```

A function that folds a value into a mutable result container.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/java/util/function/BiConsumer<A, T>` | a function which folds a value into a mutable result container <br /> |

### characteristics

Added in [API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public abstract Set<Collector.Characteristics> characteristics ()
```

Returns a `Set` of `Collector.Characteristics` indicating the characteristics of this Collector. This set should be immutable.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/java/util/Set<https://developer.android.com/reference/java/util/stream/Collector.Characteristics>` | an immutable set of collector characteristics <br /> |

### combiner

Added in [API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public abstract BinaryOperator<A> combiner ()
```

A function that accepts two partial results and merges them. The combiner function may fold state from one argument into the other and return that, or may return a new result container.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/java/util/function/BinaryOperator<A>` | a function which combines two partial results into a combined result <br /> |

### finisher

Added in [API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public abstract Function<A, R> finisher ()
```

Perform the final transformation from the intermediate accumulation type `A` to the final result type `R`.

If the characteristic `IDENTITY_FINISH` is set, this function may be presumed to be an identity transform with an unchecked cast from `A` to `R`.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/java/util/function/Function<A, R>` | a function which transforms the intermediate result to the final result <br /> |

### of

Added in [API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static Collector<T, A, R> of (Supplier<A> supplier, 
                BiConsumer<A, T> accumulator, 
                BinaryOperator<A> combiner, 
                Function<A, R> finisher, 
                Characteristics... characteristics)
```

Returns a new `Collector` described by the given `supplier`, `accumulator`, `combiner`, and `finisher` functions.

<br />

| Parameters ||
|---|---|
| `supplier` | `Supplier`: The supplier function for the new collector <br /> |
| `accumulator` | `BiConsumer`: The accumulator function for the new collector <br /> |
| `combiner` | `BinaryOperator`: The combiner function for the new collector <br /> |
| `finisher` | `Function`: The finisher function for the new collector <br /> |
| `characteristics` | `Characteristics`: The collector characteristics for the new collector <br /> |

| Returns ||
|---|---|
| `https://developer.android.com/reference/java/util/stream/Collector<T, A, R>` | the new `Collector` <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/NullPointerException` | if any argument is null |

### of

Added in [API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static Collector<T, R, R> of (Supplier<R> supplier, 
                BiConsumer<R, T> accumulator, 
                BinaryOperator<R> combiner, 
                Characteristics... characteristics)
```

Returns a new `Collector` described by the given `supplier`, `accumulator`, and `combiner` functions. The resulting `Collector` has the `Collector.Characteristics.IDENTITY_FINISH` characteristic.

<br />

| Parameters ||
|---|---|
| `supplier` | `Supplier`: The supplier function for the new collector <br /> |
| `accumulator` | `BiConsumer`: The accumulator function for the new collector <br /> |
| `combiner` | `BinaryOperator`: The combiner function for the new collector <br /> |
| `characteristics` | `Characteristics`: The collector characteristics for the new collector <br /> |

| Returns ||
|---|---|
| `https://developer.android.com/reference/java/util/stream/Collector<T, R, R>` | the new `Collector` <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/NullPointerException` | if any argument is null |

### supplier

Added in [API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public abstract Supplier<A> supplier ()
```

A function that creates and returns a new mutable result container.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/java/util/function/Supplier<A>` | a function which returns a new, mutable result container <br /> |