JAva 8の特性:Collectors.グループpingByはグループ化、ソートなどの操作を行う(二)
参考博文
Streamクラスの関数
データセットの簡単なパケット統計が可能です.関数パラメータはインタフェースCollectorですが、final class Collectorsの内部静的クラスCollectorImplになります.Collectorインタフェースのコードは次のとおりです.
Collectors
Collectorsの静的内部クラスはCollectorインタフェースを実現し、最大値、最小値、平均値、和などの関数を提供し、groupingBy(XXX)と組み合わせてデータセットをグループ化することができ、関連関数と使用例は以下の通りである.
1. Collectors.summingInt(XXX)
summingIntソース:
パラメータToIntoFunctionクラスソースコード
戻り値クラスが継承するインタフェースCollector
Collectors.CollectorImpl、静的内部クラス
TODOは平均数と和を求める関数コードを1段置いて、まったく底の実現を理解していません
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);
}