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

com.google.gwt.emul.java.util.stream.Collector Maven / Gradle / Ivy

There is a newer version: 2.10.0
Show newest version
/*
 * Copyright 2016 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package java.util.stream;

import static javaemul.internal.InternalPreconditions.checkNotNull;

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;

/**
 * See the
 * official Java API doc for details.
 * @param  the type of data to be collected
 * @param  the type of accumulator used to track results
 * @param  the final output data type
 */
public interface Collector {

  /**
   * See 
   * the official Java API doc for details.
   */
  enum Characteristics { CONCURRENT, IDENTITY_FINISH, UNORDERED }

  static  Collector of(
      Supplier supplier,
      BiConsumer accumulator,
      BinaryOperator combiner,
      Function finisher,
      Characteristics... characteristics) {
    checkNotNull(supplier);
    checkNotNull(accumulator);
    checkNotNull(combiner);
    checkNotNull(finisher);
    checkNotNull(characteristics);
    return new CollectorImpl<>(
        supplier,
        accumulator,
        combiner,
        finisher,
        characteristics
    );
  }

  static  Collector of(
      Supplier supplier,
      BiConsumer accumulator,
      BinaryOperator combiner,
      Characteristics... characteristics) {
    checkNotNull(supplier);
    checkNotNull(accumulator);
    checkNotNull(combiner);
    checkNotNull(characteristics);
    return new CollectorImpl(
        supplier,
        accumulator,
        combiner,
        Function.identity(),
        Collections.unmodifiableSet(EnumSet.of(Characteristics.IDENTITY_FINISH, characteristics))
    );
  }

  Supplier supplier();

  BiConsumer accumulator();

  Set characteristics();

  BinaryOperator combiner();

  Function finisher();

  /**
   * Simple internal implementation of a collector, holding each of the functions in a field.
   */
  final class CollectorImpl implements Collector {
    private final Supplier supplier;
    private final BiConsumer accumulator;
    private final Set characteristics;
    private final BinaryOperator combiner;
    private final Function finisher;

    public CollectorImpl(
        Supplier supplier,
        BiConsumer accumulator,
        BinaryOperator combiner,
        Function finisher,
        Characteristics... characteristics) {
      this.supplier = supplier;
      this.accumulator = accumulator;
      if (characteristics.length == 0) {
        this.characteristics = Collections.emptySet();
      } else if (characteristics.length == 1) {
        this.characteristics = Collections.singleton(characteristics[0]);
      } else {
        this.characteristics =
            Collections.unmodifiableSet(EnumSet.of(characteristics[0], characteristics));
      }
      this.combiner = combiner;
      this.finisher = finisher;
    }

    public CollectorImpl(
        Supplier supplier,
        BiConsumer accumulator,
        BinaryOperator combiner,
        Function finisher,
        Set characteristics) {
      this.supplier = supplier;
      this.accumulator = accumulator;
      this.combiner = combiner;
      this.finisher = finisher;
      this.characteristics = characteristics;
    }

    @Override
    public Supplier supplier() {
      return supplier;
    }

    @Override
    public BiConsumer accumulator() {
      return accumulator;
    }

    @Override
    public BinaryOperator combiner() {
      return combiner;
    }

    @Override
    public Function finisher() {
      return finisher;
    }

    @Override
    public Set characteristics() {
      return characteristics;
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy