package java.util.stream;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
public final class Collectors
{
private static <I, R> Function<I, R> castingIdentity()
{
return i -> (R) i;
}
static class CollectorImpl<T, A, R> implements Collector<T, A, R>
{
private final Supplier<A> supplier;
private final BiConsumer<A, T> accumulator;
private final BinaryOperator<A> combiner;
private final Function<A, R> finisher;
private final Set<Characteristics> characteristics;
CollectorImpl(Supplier<A> supplier, BiConsumer<A, T> accumulator, BinaryOperator<A> combiner, Function<A, R> finisher, Set<Characteristics> characteristics)
{
this.supplier= supplier;
this.accumulator= accumulator;
this.combiner= combiner;
this.finisher= finisher;
this.characteristics= characteristics;
}
CollectorImpl(Supplier<A> supplier, BiConsumer<A, T> accumulator, BinaryOperator<A> combiner, Set<Characteristics> characteristics)
{
this(supplier, accumulator, combiner, castingIdentity(), characteristics);
}
public BiConsumer<A, T> accumulator()
{
return accumulator;
}
public Supplier<A> supplier()
{
return supplier;
}
public BinaryOperator<A> combiner()
{
return combiner;
}
public Function<A, R> finisher()
{
return finisher;
}
public Set<Characteristics> characteristics()
{
return characteristics;
}
}
public static <T> Collector<T, ?, List<T>> toList()
{
return new Collector<T, Object, List<T>>()
{
List<Object> result= new ArrayList<Object>();
public Supplier<Object> supplier()
{
return null;
}
public BiConsumer<Object, T> accumulator()
{
return (o, t) -> result.add(t);
}
public BinaryOperator<Object> combiner()
{
return null;
}
public Function<Object, List<T>> finisher()
{
return o -> (List) result;
}
public Set<Characteristics> characteristics()
{
return null;
}
};
}
}