如果这是经常需要的功能,我们最好做一个
Collector。我们将需要一个
Stats类来保存
count, min,max,并需要使用工厂方法来创建统计收集器。
Stats<String> stats = stringStream.collect(Stats.collector())fooStream.collect(Stats.collector(fooComparator))
(也许更好的便捷方法是
Stats.collect(stream))
我做了一个示例
Stats课-
https://gist.github.com/zhong-j-
yu/ac5028573c986f7820b25ea2e74ed672
public class Stats<T>{ int count; final Comparator<? super T> comparator; T min; T max; public Stats(Comparator<? super T> comparator) { this.comparator = comparator; } public int count(){ return count; } public T min(){ return min; } public T max(){ return max; } public void accept(T val) { if(count==0) min = max = val; else if(comparator.compare(val, min)<0) min = val; else if(comparator.compare(val, max)>0) max = val; count++; } public Stats<T> combine(Stats<T> that) { if(this.count==0) return that; if(that.count==0) return this; this.count += that.count; if(comparator.compare(that.min, this.min)<0) this.min = that.min; if(comparator.compare(that.max, this.max)>0) this.max = that.max; return this; } public static <T> Collector<T, Stats<T>, Stats<T>> collector(Comparator<? super T> comparator) { return Collector.of( ()->new Stats<>(comparator), Stats::accept, Stats::combine, Collector.Characteristics.UNORDERED, Collector.Characteristics.IDENTITY_FINISH ); } public static <T extends Comparable<? super T>> Collector<T, Stats<T>, Stats<T>> collector() { return collector(Comparator.naturalOrder()); }}


