- Java核心技術·卷Ⅱ:高級特性(原書第10版)
- (美)凱S.霍斯特曼
- 1135字
- 2020-10-30 18:10:35
1.8 收集結果
當處理完流之后,通常會想要查看其元素。此時可以調用iterator方法,它會產生可以用來訪問元素的舊式風格的迭代器。
或者,可以調用forEach方法,將某個函數應用于每個元素:

在并行流上,forEach方法會以任意順序遍歷各個元素。如果想要按照流中的順序來處理它們,可以調用forEachOrdered方法。當然,這個方法會喪失并行處理的部分甚至全部優勢。
但是,更常見的情況是,我們想要將結果收集到數據結構中。此時,可以調用toArray,獲得由流的元素構成的數組。
因為無法在運行時創建泛型數組,所以表達式stream.toArray()會返回一個Object[]數組。如果想要讓數組具有正確的類型,可以將其傳遞到數組構造器中:

針對將流中的元素收集到另一個目標中,有一個便捷方法collect可用,它會接受一個Collector接口的實例。Collectors類提供了大量用于生成公共收集器的工廠方法。為了將流收集到列表或集中,可以直接調用

或

如果想要控制獲得的集的種類,那么可以使用下面的調用:

假設想要通過連接操作來收集流中的所有字符串。我們可以調用

如果想要在元素之間增加分隔符,可以將分隔符傳遞給joining方法:

如果流中包含除字符串以外的其他對象,那么我們需要現將其轉換為字符串,就像下面這樣:

如果想要將流的結果約簡為總和、平均值、最大值或最小值,可以使用summarizing(Int|Long|Double)方法中的某一個。這些方法會接受一個將流對象映射為數據的函數,同時,這些方法會產生類型為(Int|Long|Double)SummaryStatistics的結果,同時計算總和、數量、平均值、最小值和最大值。

java.util.stream.BaseStream 8
·Iterator<T>iterator()
產生一個用于獲取當前流中各個元素的迭代器。這是一種終結操作。
程序清單1-4中的示例程序展示了如何從流中收集元素。
程序清單1-4 collecting/CollectingResults.java



java.util.stream.Stream 8
·void forEach(Consumer<?super T>action)
在流的每個元素上調用action。這是一種終結操作。
·Object[]toArray()
·<A>A[]toArray(IntFunction<A[]>generator)
產生一個對象數組,或者在將引用A[]::new傳遞給構造器時,返回一個A類型的數組。這些操作都是終結操作。
·<R,A>R collect(Collector<?super T,A,R>collector)
使用給定的收集器來收集當前流中的元素。Collectors類有用于多種收集器的工廠方法。
java.util.stream.Collectors 8
·static<T>Collector<T,?,List<T>>toList()
·static<T>Collector<T,?,Set<T>>toSet()
產生一個將元素收集到列表或集中的收集器。
·static<T,C extends Collection<T>>Collector<T,?,C>toCollection(Supplier<C>collectionFactory)
產生一個將元素收集到任意集合中的收集器。可以傳遞一個諸如TreeSet::new的構造器引用。?
·static Collector<CharSequence,?,String>joining()
·static Collector<CharSequence,?,String>joining(CharSequence delimiter)
·static Collector<CharSequence,?,String>joining(CharSequence delimiter,CharSequence pref ix,CharSequence suff ix)
產生一個連接字符串的收集器。分隔符會置于字符串之間,而第一個字符串之前可以有前綴,最后一個字符串之后可以有后綴。如果沒有指定,那么它們都為空。
·static<T>Collector<T,?,IntSummaryStatistics>summarizingInt(ToIntFunction<?super T>mapper)
·static<T>Collector<T,?,LongSummaryStatistics>summarizingLong(ToLongFunction<?superT>mapper)
·static<T>Collector<T,?,DoubleSummaryStatistics>summarizingDouble(ToDoubleFunction<?super T>mapper)
產生能夠生成(Int|Long|Double)SummaryStatistics對象的收集器,通過它可以獲得將mapper應用于每個元素后所產生的結果的個數、總和、平均值、最大值和最小值。
IntSummaryStatistics 8
LongSummaryStatistics 8
DoubleSummaryStatistics 8
·long getCount()
產生匯總后的元素的個數。
·(int|long|double)getSum()
·double getAverage()
產生匯總后的元素的總和或平均值,或者在沒有任何元素時返回0。
·(int|long|double)getMax()
·(int|long|double)getMin()
產生匯總后的元素的最大值和最小值,或者在沒有任何元素時,產生(Integer|Long|Double).(MAX|MIN)_VALUE。