JAva 8の特性:Collectors.グループpingByはグループ化、ソートなどの操作を行う(二)


参考博文
Streamクラスの関数
<R, A> R collect(Collector super T, A, R> collector);

データセットの簡単なパケット統計が可能です.関数パラメータはインタフェースCollectorですが、final class Collectorsの内部静的クラスCollectorImplになります.Collectorインタフェースのコードは次のとおりです.
public interface Collector {

    Suppliersupplier();
BiConsumeraccumulator();
BinaryOperatorcombiner();
Functionfinisher();
Set characteristics();
public static Collector of(Supplier supplier,
BiConsumer accumulator,
BinaryOperator combiner,
Characteristics... characteristics) {
Objects.requireNonNull(supplier);
Objects.requireNonNull(accumulator);
Objects.requireNonNull(combiner);
Objects.requireNonNull(characteristics);
Set cs = (characteristics.length == 0)
? Collectors.CH_ID
: Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH,
characteristics));
return new Collectors.CollectorImpl<>(supplier, accumulator, combiner, cs);
}
public static Collector of(Suppliersupplier,
BiConsumeraccumulator,
BinaryOperatorcombiner,
Functionfinisher,
Characteristics... characteristics) {
Objects.requireNonNull(supplier);
Objects.requireNonNull(accumulator);
Objects.requireNonNull(combiner);
Objects.requireNonNull(finisher);
Objects.requireNonNull(characteristics);
Set cs = Collectors.CH_NOID;
if (characteristics.length > 0) {
cs = EnumSet.noneOf(Characteristics.class);
Collections.addAll(cs, characteristics);
cs = Collections.unmodifiableSet(cs);
}
return new Collectors.CollectorImpl<>(supplier, accumulator, combiner, finisher, cs);
}
enum Characteristics {
CONCURRENT,
UNORDERED,
IDENTITY_FINISH
}
}

Collectors
Collectorsの静的内部クラスはCollectorインタフェースを実現し、最大値、最小値、平均値、和などの関数を提供し、groupingBy(XXX)と組み合わせてデータセットをグループ化することができ、関連関数と使用例は以下の通りである.
1. Collectors.summingInt(XXX)
summingIntソース:

    /**
     *     
     *     Collector  ,          ‘int  ’   
     *
     * @param        
     * @param mapper   ,          
     * @return Collector ,    '    '  
     */
    public static  Collector
    summingInt(ToIntFunction super T> mapper) {
        return new Collectors.CollectorImpl<>(
                () -> new int[1],//Supplier=== T get();
                (a, t) -> { a[0] += mapper.applyAsInt(t); },//BiConsumer=== void accept(T t, U u)
                (a, b) -> { a[0] += b[0]; return a; },// BinaryOperator===  R apply(T t, U u)
                a -> a[0], // Function=== R apply(T t);
                CH_NOID);// Set == int size();
    }

パラメータToIntoFunctionクラスソースコード
@FunctionalInterface
public interface ToIntFunction {

    /**
     * Applies this function to the given argument.
     *
     * @param value     
     */
    int applyAsInt(T value);
}

戻り値クラスが継承するインタフェースCollector
/*
 *   
 *    1.              ;
 *    2.of         ;
 *    3.   ,  
 *       CONCURRENT,UNORDERED,IDENTITY_FINISH    
 */
public interface Collector {

    Suppliersupplier();
BiConsumeraccumulator();
BinaryOperatorcombiner();
Functionfinisher();
Set characteristics();
/*パラメータとメソッドの り タイプ
* えられた3つの  クラスインタフェースインスタンスでCollectorインタフェース  クラスCollectorsを   する.CollectorImplインスタンスを します。
*/
public static Collector of(Supplier supplier,
BiConsumer accumulator,
BinaryOperator combiner,
Characteristics... characteristics) {
Objects.requireNonNull(supplier);//  クラスインタフェースがnullでないことを  します。そうしないと、 げ   に  です。
Objects.requireNonNull(accumulator);//  
Objects.requireNonNull(combiner);//  
Objects.requireNonNull(characteristics);//  
Set cs = (characteristics.length == 0)
? Collectors.CH_ID
: Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH,
characteristics));
return new Collectors.CollectorImpl<>(supplier, accumulator, combiner, cs);
}
/*
* えられた3つの  クラスインタフェースインスタンスでCollectorインタフェース  クラスCollectorsを   する.CollectorImplインスタンスを します。
*/
public static Collector of(Suppliersupplier,
BiConsumeraccumulator,
BinaryOperatorcombiner,
Functionfinisher,
Characteristics... characteristics) {
Objects.requireNonNull(supplier);
Objects.requireNonNull(accumulator);
Objects.requireNonNull(combiner);
Objects.requireNonNull(finisher);
Objects.requireNonNull(characteristics);
Set cs = Collectors.CH_NOID;
if (characteristics.length > 0) {
cs = EnumSet.noneOf(Characteristics.class);
Collections.addAll(cs, characteristics);
cs = Collections.unmodifiableSet(cs);
}
return new Collectors.CollectorImpl<>(supplier, accumulator, combiner, finisher, cs);
}
enum Characteristics {
CONCURRENT,
UNORDERED,
IDENTITY_FINISH
}
}

Collectors.CollectorImpl、静的内部クラス
   /**
     * Simple implementation class for {@code Collector}.
     *   1.    final  ,       Collector     ,          ;
     *   2.     ,     Collector  ;
     *   3.       ,      ;
     */
    static class CollectorImpl implements Collector {
        private final Suppliersupplier;
private final BiConsumeraccumulator;
private final BinaryOperatorcombiner;
private final Functionfinisher;
private final Set characteristics;
CollectorImpl(Suppliersupplier,
BiConsumeraccumulator,
BinaryOperatorcombiner,
Functionfinisher,
Set characteristics) {
this.supplier = supplier;
this.accumulator = accumulator;
this.combiner = combiner;
this.finisher = finisher;
this.characteristics = characteristics;
}
CollectorImpl(Suppliersupplier,
BiConsumeraccumulator,
BinaryOperatorcombiner,
Set characteristics) {
this(supplier, accumulator, combiner, castingIdentity(), characteristics);
}
@Override
public BiConsumeraccumulator() {
return accumulator;
}
@Override
public Suppliersupplier() {
return supplier;
}
@Override
public BinaryOperatorcombiner() {
return combiner;
}
@Override
public Functionfinisher() {
return finisher;
}
@Override
public Set characteristics() {
return characteristics;
}
}

TODOは平均数と和を求める関数コードを1段置いて、まったく底の実現を理解していません
  /**
   *    
   */
    public static  Collector
    averagingInt(ToIntFunction super T> mapper) {
        return new Collectors.CollectorImpl<>(
                () -> new long[2],
                (a, t) -> { a[0] += mapper.applyAsInt(t); a[1]++; },
                (a, b) -> { a[0] += b[0]; a[1] += b[1]; return a; },
                a -> (a[1] == 0) ? 0.0d : (double) a[0] / a[1],
                CH_NOID);
    }

 /**
   *  
   */
    public static  Collector
    summingInt(ToIntFunction super T> mapper) {
        return new Collectors.CollectorImpl<>(
                () -> new int[1],
                (a, t) -> { a[0] += mapper.applyAsInt(t); },
                (a, b) -> { a[0] += b[0]; return a; },
                a -> a[0], CH_NOID);
    }