All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.andyshao.util.stream.CollectorImpl Maven / Gradle / Ivy

The newest version!
package com.github.andyshao.util.stream;

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

import java.util.Collections;
import java.util.EnumSet;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;

/**
 * 
 * Title:
* Descript:
* Copyright: Copryright(c) Jan 16, 2018
* Encoding: UNIX UTF-8 * * @author weichuang.shao * * @param the type of input elements to the reduction operation * @param the mutable accumulation type of the reduction operation (often * hidden as an implementation detail) * @param the result type of the reduction operation * @since 3.2.9 */ @AllArgsConstructor @NoArgsConstructor public class CollectorImpl implements Collector { private Supplier supplier; private BiConsumer accumulator; private BinaryOperator combiner; private Function finisher; private Set characteristics; /**CH concurrent ID*/ public static final Set CH_CONCURRENT_ID = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.CONCURRENT , Collector.Characteristics.UNORDERED , Collector.Characteristics.IDENTITY_FINISH)); /**CH concurrent NOID*/ public static final Set CH_CONCURRENT_NOID = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.CONCURRENT , Collector.Characteristics.UNORDERED)); /**CH ID*/ public static final Set CH_ID = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH)); /**CH Unordered ID*/ public static final Set CH_UNORDERED_ID = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.UNORDERED , Collector.Characteristics.IDENTITY_FINISH)); /**CH NOID*/ public static final Set CH_NOID = Collections.emptySet(); @Override public Supplier supplier() { return this.supplier; } @Override public BiConsumer accumulator() { return this.accumulator; } @Override public BinaryOperator combiner() { return this.combiner; } @Override public Function finisher() { return this.finisher; } @Override public Set characteristics() { return this.characteristics; } /** * builder * @return {@link CollectorImpl.Builder} * @param input type * @param accumulate type * @param return type */ public static final CollectorImpl.Builder builder() { return new CollectorImpl.Builder(); } /** * return type is accumulate type * @return {@link CollectorImpl.Builder} * @param input type * @param accumulate type */ public static final CollectorImpl.Builder idBuilder() { return CollectorImpl.builder() .withFinisher(Function.identity()) .withCharacteristics(CH_ID); } /** * return type is accumulate type, and it is concurrent mode * @return {@link CollectorImpl.Builder} * @param input type * @param accumulate type */ public static final CollectorImpl.Builder idCurrentBuilder() { return CollectorImpl.builder() .withFinisher(Function.identity()) .withCharacteristics(CH_CONCURRENT_ID); } /** * {@link CollectorImpl} builder * @param input type * @param accumulate type * @param return type */ public static class Builder { private Supplier supplier; private BiConsumer accumulator; private BinaryOperator combiner; private Function finisher; private Set characteristics; /** * set {@link java.util.stream.Collector.Characteristics} * @param characteristics {@link java.util.stream.Collector.Characteristics} * @return {@link Builder} */ public Builder withCharacteristics(Set characteristics){ this.characteristics = characteristics; return this; } /** * set accumulator to result convertor * @param finisher the convertor * @return {@link Builder} */ public Builder withFinisher(Function finisher){ this.finisher = finisher; return this; } /** * set accumulator combination * @param combiner combination function * @return {@link Builder} */ public Builder withCombiner(BinaryOperator combiner){ this.combiner = combiner; return this; } /** * set accumulator * @param accumulator accumulated function * @return {@link Builder} */ public Builder withAccumulator(BiConsumer accumulator){ this.accumulator = accumulator; return this; } /** * build operation * @return {@link CollectorImpl} */ public CollectorImpl build() { return new CollectorImpl<>(supplier , accumulator , combiner , finisher , characteristics); } /** * set accumulator creator * @param supplier accumulator creator * @return {@link Builder} */ public Builder withSupplier(Supplier supplier){ this.supplier = supplier; return this; } } }